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
предоставя данни, каквито може да съдържа вашата таблица:едно времеви печат ts
на минута с bandwidth
номер. (Не се нуждаете от тази част, вместо това работите с вашата маса.)
Ето едно много подобно решение за много подобен въпрос - с подробно обяснение как работи това конкретно агрегиране:
- date_trunc 5 минути интервал в PostgreSQL
Ето подобно решение за подобен въпрос относно бягането суми - с подробно обяснение и връзки за различните използвани функции:
- 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;
Извлича един неагрегирана извадка на интервал от 15 минути - от последния наличен ред в прозореца. Това ще бъде 15-ата минута, ако редът не липсва. Решаващи части са DISTINCT ON
и ORDER BY
.
Повече информация за използваната техника тук:
- Изберете ли първия ред във всяка група GROUP BY?