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:
- Funzioni finestra o espressioni di tabelle comuni:conta le righe precedenti all'interno dell'intervallo
- Alternative a PL/ruby non funzionanti:converti una tabella del giornale di registrazione warehouse
- GRUPPO PER e aggrega valori numerici sequenziali