Tôi đã gặp vấn đề tương tự.
Tôi thấy rằng thật dễ dàng để nhóm theo bất kỳ khoảng thời gian phút nào chỉ là chia kỷ nguyên theo phút theo số giây và sau đó làm tròn hoặc sử dụng tầng để đi xe phần còn lại. Vì vậy, nếu bạn muốn có khoảng thời gian trong 5 phút, bạn sẽ sử dụng 300 giây .
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
Điều này sẽ trả về nhóm dữ liệu chính xác theo khoảng phút đã chọn; tuy nhiên, nó sẽ không trả về khoảng thời gian không chứa bất kỳ dữ liệu nào. Để có được những khoảng trống đó, chúng ta có thể sử dụng hàm create_series .
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
Kết quả:
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
Bây giờ để có được kết quả với khoảng thời gian không có lần xuất hiện nào, chúng ta chỉ cần kết hợp bên ngoài cả hai tập kết quả .
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
Kết quả cuối cùng sẽ bao gồm chuỗi có tất cả các khoảng thời gian 5 phút, kể cả những chuỗi không có giá trị.
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
Có thể dễ dàng thay đổi khoảng thời gian bằng cách điều chỉnh tham số cuối cùng của create_series. Trong trường hợp của chúng tôi, chúng tôi sử dụng '5m' nhưng nó có thể là bất kỳ khoảng nào chúng tôi muốn.