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

Odpowiedz Nowy wątek
2019-09-03 09:26
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

Pozostało 580 znaków

2019-09-03 10:26
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
Hmm ciekawa koncepcja z tym number z master..spt_values :) To faktycznie zostało stworzone jako taki swoisty słownik ? - BlackBad 2019-09-03 11:21
spt_values jest nieudokumentowana, gdzieś tam trzeba siegnąć do dokumentacji Sybase i przeczytać rozdział Adaptive Server Enterprise 15.0.2 > Reference Manual: Procedures > System Procedures (http://infocenter-archive.sybase.com/help/index.jsp), czasem nawet na MSDN-ie w przykładach jest wykorzystywana, ale "nieformalnie" ;) - Panczo 2019-09-03 11:30
Właśnie tak w międzyczasie o tym poczytałem z ciekawości ;) No i jest dokładnie jak napisałeś powyżej. Dzięki (Y) - BlackBad 2019-09-03 11:32

Pozostało 580 znaków

2019-09-03 10:35
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;
Wyjasnisz co miales na mysli? Bo patrze i nie moge zalapac... - Panczo 2019-09-03 10:41
'2019-04-01' >= k.data_od AND '2019-04-01' <= k.data_do przez to zalozlem ze kolega w kolumnach ma datatime dlatego pisze takie cuda ,a ze chce dla kazdego dnia wszystkie id to mniej wiecej cos takiego mi wyszlo, intryguje mnie po co ma data_od i data_do no i czy data_do moze byc nullem :) - ipsd 2019-09-03 10:45
cast jest dla mnie zrozumiałe, nie bardzo wiem jak to ma rozwiazać problem zwrócenia tych rekordów, które w danym dniu z okresu mieszczą się w dacie od/do - Panczo 2019-09-03 11:46

Pozostało 580 znaków

2019-09-03 11:27
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.

Pozostało 580 znaków

2019-09-03 11:34
0

Pierwszy link z google wydaje się niezły... https://asktom.oracle.com/pls[...]11_QUESTION_ID:14582643282111

Pozostało 580 znaków

2019-09-03 11:44
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

Pozostało 580 znaków

2019-09-04 10:29
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ę

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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

Użytkownik: slawex