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

Pohyblivý počet řádků v časovém intervalu

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:




  1. CakePHP Model Query Return Data Formation

  2. Vypršel časový limit dotazu MySQL:(70100):Provádění dotazu bylo přerušeno

  3. Použití sady výsledků SELECT ke spuštění dotazu UPDATE s uloženými procedurami MySQL

  4. Alembic:změňte typ sloupce pomocí USING