sql >> Databáze >  >> RDS >> PostgreSQL

Jak seskupit časová razítka do ostrovů (na základě libovolné mezery)?

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?


  1. Jak vytvořit VARRAY jako člena bloku PL/SQL v databázi Oracle

  2. hash SQL řádek?

  3. MySQL Group od SUM

  4. Získejte hodnotu na základě max. z jiného sloupce seskupeného podle jiného sloupce