sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur grupperar man tidsstämplar i öar (baserat på godtyckligt gap)?

Detta skulle göra det:

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;

Underfrågan sub registrerar step som true om föregående rad är minst 2 minuter bort - sorterat efter tidsstämpelkolumnen done sig själv i det här fallet.

Den yttre frågan lägger till ett rullande antal steg, i praktiken gruppnumret (grp ) - kombinerar det samlade FILTER sats med en annan fönsterfunktion.

db<>spela här

Relaterat:

  • Fråga för att hitta alla tidsstämplar med mer än ett visst intervall från varandra
  • Hur märker man grupper i postgresql när grupptillhörighet beror på föregående rad?
  • Välj längsta kontinuerliga sekvens
  • Grupper eller fönster

Om det samlade FILTER klausul:

  • Hur kan jag förenkla den här spelstatistikfrågan?
  • Villkorlig lead/lag-funktion PostgreSQL?


  1. JSON_ARRAYAGG() Funktion i Oracle

  2. SQL-uppdatering från en tabell till en annan baserat på en ID-matchning

  3. Hur tar jag bort specifika rader i SQLite Database

  4. Få de underliggande kolumnerna i en vy baserat på dess resultatuppsättning