Ben de aynı sorunla karşılaştım.
Herhangi bir dakika aralığına göre gruplamanın kolay olduğunu buldum, dönemi sadece saniye miktarında dakikalara bölerek ve sonra geri kalanı sürmek için yuvarlama veya zemini kullanma. Yani 5 dakika içinde aralık almak istiyorsanız 300 saniye kullanırsınız .
SELECT COUNT(*) cnt,
to_timestamp(floor((extract('epoch' from timestamp_column) / 300 )) * 300)
AT TIME ZONE 'UTC' as interval_alias
FROM TABLE_NAME GROUP BY interval_alias
interval_alias cnt
2010-11-16 10:30:00 2
2010-11-16 10:35:00 10
2010-11-16 10:45:00 8
2010-11-16 10:55:00 11
Bu, verileri seçilen dakika aralığına göre doğru şekilde gruplandıracaktır; ancak, herhangi bir veri içermeyen aralıkları döndürmez. Bu boş aralıkları elde etmek için, generate_series işlevini kullanabiliriz .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Sonuç:
interval_alias
2010-11-16 10:30:00
2010-11-16 10:35:00
2010-11-16 10:40:00
2010-11-16 10:45:00
2010-11-16 10:50:00
2010-11-16 10:55:00
Şimdi sonucu sıfır oluşumlu aralıklarla elde etmek için her iki sonuç kümesini de dıştan birleştiriyoruz .
SELECT series.minute as interval, coalesce(cnt.amnt,0) as count from
(
SELECT count(*) amnt,
to_timestamp(floor((extract('epoch' from timestamp_column) / 300 )) * 300)
AT TIME ZONE 'UTC' as interval_alias
from TABLE_NAME group by interval_alias
) cnt
RIGHT JOIN
(
SELECT generate_series(min(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as minute from TABLE_NAME
) series
on series.minute = cnt.interval_alias
Nihai sonuç, hiçbir değeri olmayanlar bile 5 dakikalık aralıkların tümünü içeren serileri içerecektir.
interval count
2010-11-16 10:30:00 2
2010-11-16 10:35:00 10
2010-11-16 10:40:00 0
2010-11-16 10:45:00 8
2010-11-16 10:50:00 0
2010-11-16 10:55:00 11
Generate_series'in son parametresi ayarlanarak aralık kolayca değiştirilebilir. Bizim durumumuzda '5m' kullanıyoruz, ancak istediğimiz herhangi bir aralık olabilir .