Select zwracający dane dla każdej daty z zakresu dat

0

Witam, wszystkich, to mój pierwszy post.
Mam tabelę zawierającą rekordy z informacjami o klientach w danych przedziałach czasowych.
W skrócie tabela klienci i pola id_klienta, data_od, data_do
Teraz chciałbym uzyskać listę id_klienta dla każdej daty powiedzmy od 2019-04-01

Będę wdzięczny za pomoc.
Dopiero zaczynam z sql i na razie potrafię zrobić raczej proste zapytania, jakieś joiny, itd. A tutaj udało mi się zwrócić listę dla pojedynczego dnia. Nie chciałbym tego przepisywać kilkaset razy dla innych dat. Tym bardziej, że do id dla każdej daty trzeba będzie dołączyć dane z drugiej tabeli, w której już dane są nie dla zakresu, a dla każdej daty z osobna.

select
distinct k.id_klienta
From klienci k
Where
'2019-04-01' >= k.data_od AND
'2019-04-01' <= k.data_do

2

nie wiem na jakim silniku to potrzebujesz, ale najprosciej miec tabele pomocnicza z datami i joinem to wyciagnac, dla mssql server tak:

DECLARE @Date1 DATE, @Date2 DATE
SET @Date1 = '20190401'
SET @Date2 = getdate()


select distinct 
	k.id_klienta
From 
	klienci k
	inner join (SELECT 
					DATEADD(DAY,number+1,@Date1) [Date]
				FROM 
					master..spt_values
				WHERE 
					type = 'P'
					AND DATEADD(DAY,number+1,@Date1) < @Date2) d on d.Date between k.data_od and k.data_do
0
SELECT   DISTINCT CAST(k.data_od AS DATE) AS dzien ,
                  k.id_klienta
FROM     klienci k
WHERE    CAST(k.data_od AS DATE) = CAST(k.data_do AS DATE)
ORDER BY CAST(k.data_od AS DATE) ,
         k.id_klienta;
0

Hej. Baza to oracle. Korzytam z sql developer.
Pierwszą propozycję rozumiem poza 'master..spt_values'. Doczytam i postaram się przerobić i zastosować.
A w drugiej propozycji nie rozumiem gdzie określam datę początkową i końcową? Data od i data do nie może być null.

Cały problem polega na tym, że nie mam zestawu Klientów na każdą datę, tylko dla każdego klienta mam okresy kiedy pola utrzymywały pewną wartość.
Czyli jeśli np. ID 001 miał pole 'status_umowy' z wartością '1' od 1 kwietnia do 15 kwietnia, a od 16 kwietnia do teraz ma status umowy '2', to będzie występował jako 2 wiersze. I tak dla kilku mln rekordów. Dlatego potrzebuję móc łatwo sprawdzić jakie id miały na każdy dzień daną wartość pola.

0

Pierwszą propozycję rozumiem poza 'master..spt_values'. Doczytam i postaram się przerobić i zastosować.

master..spt_values to tabela która dla warunku type = 'P' zwroci w kolumnie number liczby od 0 do 2047 i je wykorzystuje do zwrócenia kolumny z kolejnymi datami. czyli samo podzapytanie:

SELECT 
                    DATEADD(DAY,number+1,@Date1) [Date]
                FROM 
                    master..spt_values
                WHERE 
                    type = 'P'
                    AND DATEADD(DAY,number+1,@Date1) < @Date2

zwróci

date
--------
2019-04-02
2019-04-03
...
2019-09-01
2019-09-02

i to wykorzystujemy do join-a

0

Ok, dziękuję.
Zanim zrobię to, co potrzebuję, muszę ogarnąć korzystanie ze zmiennych w Oracle. W sql server zrobiłem to z od reki bez zastanowienia. A tutaj chyba nie ogarniam :-(. Poczytam, douczę się

1 użytkowników online, w tym zalogowanych: 0, gości: 1