Zliczenie ile elementów, która mają przedział czasu według dni

0

Dalej uczę się sql i chciałem zrobić zapytanie, które na podstawie przedziału dat zliczy ile razy występuje event w danym przedziale.
Mam screenshot-20220605153420.png
Tak jest ogólnie grubsze zapytanie. Które ostatecznie to wypluwa

wygenerowałem sobie również przedział czasowy

generate_days as (
select dayDate::date from generate_series('2020-05-24T10:51:51', 
  '2022-06-24T10:51:51', '1 day'::interval) dayDate
 )

próbowałem połączyć to w taki sposób

select generate_days.dayDate, count(generate_days.dayDate) from items, generate_days
where generate_days.dayDate  between items.lower and items.upper
group by generate_days.dayDate

Jednakże to powoduje błędne zliczanie

screenshot-20220605154641.png

nie chcę robić tego po stronie backendu tylko, aby sql zwrócił mi poprawną wartość

Trochę opornie idzie mi nauka sql

EDIT:

spróbowałem również takie zapytanie

select generate_days.dayDate, count(generate_days.dayDate) from generate_days
left join items on generate_days.dayDate between items.lower and items.upper
group by generate_days.dayDate

Jednak zwracane są częściowo fałszywe wyniki. Dla przedziałów, które nie istnieją wartość count(generate_days.dayDate) wynosi 1. Jeżeli podany przedział istnieje, to ilość zliczana jest chyba poprawnie jednak nie, też jest za dużo danych zliczonych

0

zapytanie, które na podstawie przedziału dat zliczy ile razy występuje event w danym przedziale

Brzmi na:

SELECT count(*) FROM events WHERE daterange(event.lower, event.upper, '[]') && daterange(ODKĄD, DOKĄD, '[]);
0

@Patryk27:
Bardziej chodzi mi o zliczanie w drugą stronę.
Mam 3 wpisy

ID lower upper
1 2020-09-21 2020-09-22
2 2020-09-20 2020-09-22
1 2020-09-18 2020-09-18

ID się powtarza i jest to ID produktu, który był dostępny.

i teraz potrzebuję zliczyć dla każdej z dat
2020-09-17, 2020-09-18, 2020-09-19, 2020-09-20, 2020-09-21, 2020-09-22, 2020-09-23 (dane z przedziału podanego przez usera)
ile itemów w danym dniu było dostępnych
np.

data ilosc
2020-09-17 0
2020-09-18 1
2020-09-19 0
2020-09-20 1
2020-09-21 2
2020-09-22 1
2020-09-23 0

Więc w zapytaniu chodzi o to, aby zliczyć ile przedmiotów było dostępnych w danym dniu
ew. mogłem nie zrozumieć tego co podesłałeś

EDIT:

select wd.dayDate, count(wd.dayDate) from generate_days wd
left join items on wd.dayDate between items.lower and items.upper
where items.id is not null
group by wd.dayDate

Nie zauważyłem, że zliczam null, ale znów w takim przypadku nie pokazują mi się daty gdzie nic nie ma, ale to już po stronie backendu mogę załatwić

1

Więc w zapytaniu chodzi o to, aby zliczyć ile przedmiotów było dostępnych w danym dniu

Cóż, w takim razie opis zapytanie, które na podstawie przedziału [...] zliczy ile razy występuje event w danym przedziale jest nietrafiony :-P

Tak czy siak, jeśli chodzi Ci o podział dzień-po-dniu z uwzględnieniem zer, to spróbuj:

select wd.dayDate, count(items.id) from generate_days wd
left join items on wd.dayDate between items.lower and items.upper
group by wd.dayDate
0

Chyba działa poprawnie, jeszcze co prawda muszę rozbudować o kolejne zależności, ale to już raczej powinno być ok. Dzięki

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