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

データ間隔でグループ化

    WITH t AS (
       SELECT ts, (random()*100)::int AS bandwidth
       FROM   generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
       )
    
    SELECT date_trunc('hour', ts) AS hour_stump
          ,(extract(minute FROM ts)::int / 15) AS min15_slot
          ,count(*) AS rows_in_timeslice               -- optional
          ,sum(bandwidth) AS sum_bandwidth
    FROM   t
    WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
    AND    ts <  '2012-09-03 00:00:00+02'::timestamptz -- careful with borders 
    GROUP  BY 1, 2
    ORDER  BY 1, 2;
    

    CTE t テーブルが保持する可能性のあるデータを提供します:1つのタイムスタンプts bandwidthを使用した1分あたり 番号。 (その部分は必要ありません。代わりにテーブルを使用します。)

    これは、非常によく似た質問に対する非常によく似た解決策です。この特定の集計がどのように機能するかを詳細に説明しています。

    • PostgreSQLではdate_trunc5分間隔

    実行中に関する同様の質問に対する同様の解決策を次に示します。 合計-使用されるさまざまな機能の詳細な説明とリンクを含む:

    • PostgreSQL:クエリの行数を「分単位」で実行

    コメント内の追加の質問

    WITH -- same as above ...
    
    SELECT DISTINCT ON (1,2)
           date_trunc('hour', ts) AS hour_stump
          ,(extract(minute FROM ts)::int / 15) AS min15_slot
          ,bandwidth AS bandwith_sample_at_min15
    FROM   t
    WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz
    AND    ts <  '2012-09-03 00:00:00+02'::timestamptz
    ORDER  BY 1, 2, ts DESC;
    

    1つを取得します 15分間隔ごとの集約されていないサンプル-最後の利用可能な行から ウィンドウで。行が欠落していない場合、これは15分になります。重要な部分はDISTINCT ON およびORDER BY
    使用されているテクニックの詳細については、こちらをご覧ください:

    • 各GROUPBYグループの最初の行を選択しますか?


    1. すべてのテーブルのシーケンスIDpostgreSQLを一括更新する方法

    2. データベースの削除中にエラーが発生しました(rmdir'.test \'ができません、errno:17)

    3. ビューで使用されているエイリアスの実際の列名を見つけますか?

    4. MicrosoftAccessのレポートウィザードを使用してレポートを作成する方法