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;
t
CTE menyediakan data seperti yang mungkin dimiliki tabel Anda:satu stempel waktu ts
per menit dengan bandwidth
nomor. (Anda tidak memerlukan bagian itu, Anda bekerja dengan meja Anda saja.)
Berikut adalah solusi yang sangat mirip untuk pertanyaan yang sangat mirip - dengan penjelasan mendetail tentang cara kerja agregasi khusus ini:
- date_trunc interval 5 menit di PostgreSQL
Berikut adalah solusi serupa untuk pertanyaan serupa tentang berjalan sums - dengan penjelasan mendetail dan tautan untuk berbagai fungsi yang digunakan:
- PostgreSQL:menjalankan hitungan baris untuk kueri 'menurut menit'
Pertanyaan tambahan di komentar
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;
Mengambil satu sampel tidak teragregasi per interval 15 menit - dari baris terakhir yang tersedia di jendela. Ini akan menjadi menit ke-15 jika baris tidak hilang. Bagian penting DISTINCT ON
dan ORDER BY
.
Informasi lebih lanjut tentang teknik yang digunakan di sini:
- Pilih baris pertama di setiap grup GROUP BY?