ฉันเจอปัญหาเดียวกัน
ฉันพบว่ามันง่ายที่จะจัดกลุ่มตามช่วงเวลานาทีใด ๆ เพียงแค่หารยุคด้วยนาทีในจำนวนวินาทีแล้วปัดเศษหรือใช้พื้นเพื่อนั่งส่วนที่เหลือ ดังนั้นหากคุณต้องการที่จะได้รับช่วงเวลา5 นาทีที่คุณจะใช้เวลา 300 วินาที
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
สิ่งนี้จะส่งคืนข้อมูลอย่างถูกต้องจัดกลุ่มตามช่วงนาทีที่เลือก อย่างไรก็ตามจะไม่ส่งคืนช่วงเวลาที่ไม่มีข้อมูลใด ๆ เพื่อให้ได้รับช่วงเวลาที่ว่างเปล่าที่เราสามารถใช้ฟังก์ชั่นgenerate_series
SELECT generate_series(MIN(date_trunc('hour',timestamp_column)),
max(date_trunc('minute',timestamp_column)),'5m') as interval_alias FROM
TABLE_NAME
ผลลัพธ์:
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
ตอนนี้ที่จะได้รับผลที่ตามมากับช่วงเวลาที่มีศูนย์เกิดขึ้นเราเพียงแค่ด้านนอกเข้าร่วมทั้งสองชุดผล
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
ผลลัพธ์สุดท้ายจะรวมซีรีส์ที่มีช่วงเวลาทั้งหมด 5 นาทีแม้กระทั่งชุดที่ไม่มีค่า
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
ช่วงเวลาสามารถเปลี่ยนแปลงได้อย่างง่ายดายโดยการปรับพารามิเตอร์สุดท้ายของ create_series ในกรณีของเราเราใช้'5m'แต่อาจเป็นช่วงเวลาใดก็ได้ที่เราต้องการ