Sons como um aplicativo para funções de janela . Mas, infelizmente, esse não é o caso. Os quadros de janela só podem ser baseados em contagens de linhas, não em valores reais de coluna.
Uma consulta simples com
LEFT JOIN
pode fazer o trabalho: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 aqui
Não funciona com
time
como em sua demonstração mínima, pois isso não envolve. Suponho que seja razoável supor timestamp
ou timestamptz
. Como você inclui cada linha na contagem, um
INNER JOIN
funcionaria também. (LEFT JOIN
ainda é mais confiável em face de possíveis valores NULL.) Ou use um
LATERAL
subconsulta e você não precisa agregar no nível de consulta externa: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;
Relacionado:
Para tabelas grandes e muitas linhas no período de tempo, uma solução procedural que percorre a tabela uma vez terá um desempenho melhor. Curti:
- Funções de janela ou expressões de tabela comuns:contam as linhas anteriores dentro do intervalo
- Alternativas para PL/ruby quebrado:converter uma tabela de diário de armazém
- GROUP BY e agregado valores numéricos sequenciais