Stačilo by to:
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;
Poddotaz sub
záznamy step
jako true
pokud je předchozí řádek vzdálen alespoň 2 minuty - seřazeno podle sloupce časového razítka done
v tomto případě sám sebe.
Vnější dotaz přidává postupný počet kroků, v podstatě číslo skupiny (grp
) - kombinace agregovaného FILTER
klauzule s jinou funkcí okna.
db<>zde hrajte
Související:
- Dotaz k nalezení všech časových razítek delších než určitý interval
- Jak označit skupiny v postgresql, když příslušnost ke skupině závisí na předchozím řádku?
- Vyberte nejdelší souvislou sekvenci
- Seskupení nebo okno
O souhrnném FILTER
klauzule:
- Jak mohu tento dotaz na herní statistiku zjednodušit?
- Podmíněná funkce lead/lag PostgreSQL?