音 ウィンドウ関数 のアプリケーションのように 。しかし、悲しいことに、そうではありません。ウィンドウフレームは、実際の列値ではなく、行数のみに基づくことができます。
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;
関連:
時間枠内の大きなテーブルと多くの行の場合、テーブルを一度ウォークスルーする手続き型ソリューション パフォーマンスが向上します。いいね: