WITH t AS (
SELECT ts, (random()*100)::int AS bandwidth
FROM generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
)
SELECT date_trunc('hour', ts) AS hour_stump
,(extract(minute FROM ts)::int / 15) AS min15_slot
,count(*) AS rows_in_timeslice -- optional
,sum(bandwidth) AS sum_bandwidth
FROM t
WHERE ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
AND ts < '2012-09-03 00:00:00+02'::timestamptz -- careful with borders
GROUP BY 1, 2
ORDER BY 1, 2;
सीटीई t
आपकी तालिका जैसा डेटा प्रदान करता है:एक टाइमस्टैम्प ts
प्रति मिनट bandwidth
. के साथ संख्या। (आपको उस हिस्से की आवश्यकता नहीं है, आप इसके बजाय अपनी तालिका के साथ काम करते हैं।)
यहां एक समान प्रश्न के लिए एक बहुत ही समान समाधान है - विस्तृत विवरण के साथ कि यह विशेष एकत्रीकरण कैसे काम करता है:
- पोस्टग्रेएसक्यूएल में
- date_trunc 5 मिनट का अंतराल
दौड़ने . से संबंधित एक समान प्रश्न के लिए यहां एक समान समाधान दिया गया है रकम - इस्तेमाल किए गए विभिन्न कार्यों के लिए विस्तृत विवरण और लिंक के साथ:
- PostgreSQL:किसी क्वेरी के लिए 'मिनट के हिसाब से' पंक्तियों की चल रही गिनती
टिप्पणी में अतिरिक्त प्रश्न
WITH -- same as above ...
SELECT DISTINCT ON (1,2)
date_trunc('hour', ts) AS hour_stump
,(extract(minute FROM ts)::int / 15) AS min15_slot
,bandwidth AS bandwith_sample_at_min15
FROM t
WHERE ts >= '2012-09-02 00:00:00+02'::timestamptz
AND ts < '2012-09-03 00:00:00+02'::timestamptz
ORDER BY 1, 2, ts DESC;
एकप्राप्त करता है प्रति 15 मिनट के अंतराल पर गैर-समेकित नमूना - अंतिम उपलब्ध पंक्ति . से खिड़की में। यह 15 वां मिनट होगा यदि पंक्ति गायब नहीं है। महत्वपूर्ण भाग हैं DISTINCT ON
और ORDER BY
.
प्रयुक्त तकनीक के बारे में अधिक जानकारी यहाँ:
- समूह द्वारा प्रत्येक समूह में पहली पंक्ति का चयन करें?