त्वरित और गंदा तरीका:http://sqlfiddle.com/#!1/bd2f6/21ए> मैंने अपने कॉलम का नाम tstamp
. रखा है आपके timestamp
. के बजाय
with t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
(select duration from tmp group by duration) b
)
select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmp on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration
संक्षिप्त विवरण:
- न्यूनतम और अधिकतम टाइमस्टैम्प की गणना करें
- न्यूनतम और अधिकतम के बीच 15 मिनट का अंतराल उत्पन्न करें
- अवधि के अद्वितीय मान वाले क्रॉस जॉइन परिणाम
- बाएं मूल डेटा में शामिल हों (बाएं शामिल होना महत्वपूर्ण है, क्योंकि यह आउटपुट में सभी संभव संयोजन रखेगा और
null
होगा। जहां अवधि दिए गए अंतराल के लिए मौजूद नहीं है। - कुल डेटा।
count(null)=0
यदि आपके पास अधिक टेबल हैं और उनके संघ पर एल्गोरिदम लागू किया जाना चाहिए। मान लीजिए हमारे पास तीन टेबल हैं tmp1, tmp2, tmp3
सभी कॉलम के साथ tstamp
और duration
. हम पिछले समाधान का विस्तार कर सकते हैं:
with
tmpout as (
select * from tmp1 union all
select * from tmp2 union all
select * from tmp3
)
,t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
(select duration from tmpout group by duration) b
)
select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmpout on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration
आपको वास्तव में with
के बारे में पता होना चाहिए PostgreSQL में खंड। PostgreSQL में किसी भी डेटा विश्लेषण के लिए यह अमूल्य अवधारणा है।