PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Conteggio progressivo delle righe nell'intervallo di tempo

Suoni come un'applicazione per funzioni finestra . Ma, purtroppo, non è così. Le cornici delle finestre possono essere basate solo sul conteggio delle righe, non sui valori effettivi delle colonne.

Una semplice query con LEFT JOIN può fare il lavoro:

SELECT t0.order_id
     , count(t1.time_created) AS count_within_3_sec
FROM   tbl      t0
LEFT   JOIN tbl t1 ON t1.time_created BETWEEN t0.time_created - interval '3 sec'
                                          AND t0.time_created
GROUP  BY 1
ORDER  BY 1;

db<>violino qui

Non funziona con time come nella tua demo minimale, poiché non si avvolge. Suppongo sia ragionevole presumere timestamp o timestamptz .

Poiché includi ogni riga stessa nel conteggio, un INNER JOIN funzionerebbe anche tu. (LEFT JOIN è ancora più affidabile di fronte a possibili valori NULL.)

Oppure usa un LATERAL subquery e non è necessario aggregare a livello di query esterna:

SELECT t0.order_id
     , t1.count_within_3_sec
FROM   tbl t0
LEFT   JOIN LATERAL (
   SELECT count(*) AS count_within_3_sec
   FROM   tbl t1
   WHERE  t1.time_created BETWEEN t0.time_created - interval '3 sec'
                              AND t0.time_created
   ) t1 ON true
ORDER  BY 1;

Correlati:

Per tabelle grandi e molte righe nell'intervallo di tempo, una soluzione procedurale che esamina la tabella una volta funzionerà meglio. Come: