Cara cepat dan kotor:http://sqlfiddle.com/#!1/bd2f6/21 Saya menamai kolom saya tstamp
alih-alih timestamp
with t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
(select duration from tmp group by duration) b
)
select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmp on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration
Penjelasan singkat:
- Menghitung stempel waktu minimum dan maksimum
- Buat interval 15 menit antara minimum dan maksimum
- Hasil gabungan silang dengan nilai durasi yang unik
- Data asli gabung kiri (gabung kiri penting, karena ini akan menyimpan semua kemungkinan kombinasi dalam output dan akan ada
null
di mana durasi tidak ada untuk interval tertentu. - Data gabungan.
count(null)=0
Jika Anda memiliki lebih banyak tabel dan algoritme harus diterapkan pada gabungannya. Misalkan kita memiliki tiga tabel tmp1, tmp2, tmp3
semua dengan kolom tstamp
dan duration
. Kami dapat memperluas solusi sebelumnya:
with
tmpout as (
select * from tmp1 union all
select * from tmp2 union all
select * from tmp3
)
,t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
(select duration from tmpout group by duration) b
)
select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmpout on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration
Anda harus benar-benar tahu with
klausa di PostgreSQL. Ini adalah konsep yang sangat berharga untuk analisis data apa pun di PostgreSQL.