Zvuky jako aplikace pro funkce oken . Ale bohužel tomu tak není. Rámce oken mohou být založeny pouze na počtu řádků, nikoli na skutečných hodnotách sloupců.
Jednoduchý dotaz s LEFT JOIN
může dělat práci:
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<>fiddle zde
Nefunguje s time
jako ve vašem minimálním demu, protože to nezabalí. Předpokládám, že je rozumné předpokládat timestamp
nebo timestamptz
.
Vzhledem k tomu, že do počtu zahrnete každý řádek samotný, INNER JOIN
taky by to fungovalo. (LEFT JOIN
je stále spolehlivější tváří v tvář možným hodnotám NULL.)
Nebo použijte LATERAL
poddotaz a nemusíte agregovat na vnější úrovni dotazu:
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;
Související:
Pro velké tabulky a mnoho řádků v časovém rámci, procedurální řešení, které prochází tabulkou jednou bude mít lepší výkon. Jako:
- Funkce oken nebo běžné tabulkové výrazy:počítání předchozích řádků v rozsahu
- Alternativy ke zlomenému PL/ruby:převod tabulky deníku skladu
- GROUP BY a agregace sekvenční číselné hodnoty