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グループの最初の行を選択しますか?