To by to zrobiło:
SELECT done, count(*) FILTER (WHERE step) OVER (ORDER BY done) AS grp
FROM (
SELECT done
, (lag(done) OVER (ORDER BY done) <= done - interval '2 min') AS step
FROM tbl
) sub
ORDER BY done;
Podzapytanie sub zapisuje step jako true jeśli poprzedni wiersz jest oddalony o co najmniej 2 minuty - posortowany według kolumny sygnatury czasowej done w tym przypadku.
Zewnętrzne zapytanie dodaje kroczącą liczbę kroków, w rzeczywistości numer grupy (grp ) - łączenie agregatu FILTER klauzula z inną funkcją okna.
db<>graj tutaj
Powiązane:
- Zapytanie, aby znaleźć wszystkie znaczniki czasu oddalone od siebie o więcej niż określony odstęp
- Jak oznaczyć grupy w postgresql, gdy przynależność do grupy zależy od poprzedniego wiersza?
- Wybierz najdłuższą ciągłą sekwencję
- Grupowanie lub okno
Informacje o agregacie FILTER klauzula:
- Jak mogę uprościć to zapytanie o statystyki gry?
- Warunkowa funkcja wyprzedzenia/opóźnienia w PostgreSQL?