আমি একই ইস্যু জুড়ে এসেছি।
আমি দেখতে পেলাম যে কোনও মিনিটের ব্যবধানে গ্রুপিং করা সহজ , সেকেন্ডের পরিমাণ কয়েক মিনিট ধরে মহাকাব্যকে ভাগ করে নেওয়া হয় এবং তারপরে বাকী অংশটি চালিয়ে যাওয়ার জন্য হয় বৃত্তাকার বা মেঝে ব্যবহার করে। সুতরাং আপনি যদি 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
জেনারেট_সরিজের শেষ প্যারামিটারটি সামঞ্জস্য করে ব্যবধানটি সহজেই পরিবর্তন করা যায়। আমাদের ক্ষেত্রে আমরা '5 মি' ব্যবহার করি তবে এটি আমাদের চাই কোনও অন্তর হতে পারে ।