आप generate_series() द्वारा बनाए गए अंतरालों को जोड़कर "बाल्टी" की एक तालिका तैयार कर सकते हैं। यह SQL स्टेटमेंट पहले दिन के लिए पांच मिनट की बकेट की एक टेबल जेनरेट करेगा (min(measured_at)
का मान) ) आपके डेटा में।
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
लपेटें कि एक सामान्य तालिका अभिव्यक्ति में बयान, और आप इसमें शामिल हो सकते हैं और उस पर समूह बना सकते हैं जैसे कि यह एक आधार तालिका थी।
with five_min_intervals as (
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
)
select f.start_time, f.end_time, avg(m.val) avg_val
from measurements m
right join five_min_intervals f
on m.measured_at >= f.start_time and m.measured_at < f.end_time
group by f.start_time, f.end_time
order by f.start_time
सेकंड की मनमानी संख्या के आधार पर समूह बनाना समान है--उपयोग date_trunc()
।
Generate_series() के अधिक सामान्य उपयोग से आप पाँच मिनट की बकेट की ऊपरी सीमा का अनुमान लगाने से बच सकते हैं। व्यवहार में, आप शायद इसे एक दृश्य या फ़ंक्शन के रूप में बनाएंगे। आपको आधार तालिका से बेहतर प्रदर्शन मिल सकता है।
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, ((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60, 5) n;