Звуци като приложение за прозоречни функции . Но, за съжаление, това не е така. Рамките на прозорците могат да се основават само на броя на редовете, а не на действителните стойности на колоните.
Проста заявка с LEFT JOIN
може да свърши работата:
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 тук
Не работи с time
като във вашата минимална демонстрация, тъй като това не се увива. Предполагам, че е разумно да приемем timestamp
или timestamptz
.
Тъй като включвате всеки ред в преброяването, INNER JOIN
също ще работи. (LEFT JOIN
все още е по-надежден в лицето на възможни NULL стойности.)
Или използвайте LATERAL
подзаявка и не е необходимо да обобщавате на външно ниво на заявка:
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;
Свързани:
За големи маси и много редове във времевата рамка, процедурно решение, което минава през таблицата веднъж ще се представи по-добре. Като:
- Прозоречни функции или общи изрази на таблици:преброяване на предишни редове в диапазона
- Алтернативи на счупен PL/ruby:преобразувайте таблица на складови дневници
- ГРУПИРАНЕ ПО и обобщаване последователни числови стойности