SELECT grid.t5
,min(t."time") AS min_time
-- ,array_agg(extract(min FROM t."time")) AS 'players_on' -- optional
,avg(t.players) AS avg_players
,avg(t.servers) AS avg_servers
FROM (
SELECT generate_series(min("time")
,max("time"), interval '5 min') AS t5
FROM tbl
) grid
LEFT JOIN tbl t ON t."time" >= grid.t5
AND t."time" < grid.t5 + interval '5 min'
GROUP BY grid.t5
ORDER BY grid.t5;
व्याख्या करें
-
सबक्वेरी
grid
न्यूनतम से अधिकतम "time"
. तक प्रत्येक 5 मिनट के लिए एक पंक्ति उत्पन्न करता है आपकी तालिका में। -
LEFT 5-मिनट के अंतराल में डेटा स्लाइसिंग तालिका में वापस शामिल हों। ध्यान से शामिल करें निचली सीमा और बहिष्कृत करें ऊपरी सीमा।
-
जहां कुछ नहीं हुआ वहां 5-मिनट के स्लॉट ड्रॉप करने के लिए,
JOIN
. का उपयोग करेंLEFT JOIN
. के स्थान पर । -
अपना ग्रिड-टाइम 0:00, 5:00 आदि पर शुरू करने के लिए,
min("time")
को राउंड डाउन करें मेंgenerate_series()
।
इन संबंधित उत्तरों में अधिक स्पष्टीकरण:
Group by डेटा अंतराल
पोस्टग्रेएसक्यूएल:एक क्वेरी के लिए पंक्तियों की संख्या 'मिनट के अनुसार' चल रही है
इसके अलावा:मैं time
का उपयोग नहीं करूंगा पहचानकर्ता के रूप में। यह एक मानक SQL में आरक्षित शब्द
है और Postgres में एक फ़ंक्शन / प्रकार का नाम।