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;
CTEt 提供的数据类似于您的表可能保存的数据:每分钟一个时间戳 ts 和一个 bandwidth 数字。 (您不需要那部分,而是使用您的表格。)
对于一个非常相似的问题,这里有一个非常相似的解决方案 - 详细解释了这个特定聚合是如何工作的:
以下是关于running sums 的类似问题的类似解决方案 - 详细说明和所用各种函数的链接:
评论中的其他问题
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 分钟间隔检索 一个 未聚合的样本 - 从窗口中的最后一个可用行。如果该行没有丢失,这将是第 15 分钟。关键部分是DISTINCT ON 和ORDER BY。
有关所用技术的更多信息,请点击此处: