sql >> データベース >  >> RDS >> PostgreSQL

時間間隔のある行のローリングカウント

    ウィンドウ関数 のアプリケーションのように 。しかし、悲しいことに、そうではありません。ウィンドウフレームは、実際の列値ではなく、行数のみに基づくことができます。

    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;
    

    関連:

    時間枠内の大きなテーブルと多くの行の場合、テーブルを一度ウォークスルーする手続き型ソリューション パフォーマンスが向上します。いいね:




    1. SQLクエリをどのように管理しますか

    2. なぜこれがリソースID#2を返すのですか?

    3. NUMBER_ARRAYのpreparedStatement設定nullが機能しない

    4. PDOMySQLを使用して2つのテーブルに挿入します