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 は、テーブルが保持するようなデータを提供します: 1 分あたり 1t
つのタイムスタンプと数値。(その部分は必要ありません。代わりにテーブルで作業します。)ts
bandwidth
これは、非常によく似た質問に対する非常によく似た解決策です-この特定の集計がどのように機能するかについての詳細な説明があります:
これは、実行中の合計に関する同様の質問に対する同様の解決策です-使用されるさまざまな機能の詳細な説明とリンクがあります。
コメントでの追加の質問
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;
ウィンドウ内の最後の使用可能な行から、15 分間隔ごとに1 つの非集計サンプルを取得します。行が欠落していない場合、これは15分目になります。重要な部分はとです。
ここで使用される技術の詳細については、次のとおりです。DISTINCT ON
ORDER BY