पहला तरीका जो दिमाग में आता है वह है row_number()
. का उपयोग करना तालिका को एनोटेट करने के लिए, फिर 16 पंक्तियों के ब्लॉक के आधार पर समूहित करें।
SELECT min(id) as first_id, max(id) AS last_id, avg(rainfall) AS avg_this_16
FROM (
SELECT id, rainfall, row_number() OVER (order by id) AS n
FROM the_table
) x(id,rainfall,n)
GROUP BY n/16
ORDER BY n/16;
ध्यान दें कि इसमें अंतिम समूह के लिए आवश्यक रूप से 16 नमूने शामिल नहीं होंगे।
वैकल्पिक रूप से आप चल रहे औसत . की गणना कर सकते हैं avg()
. का उपयोग करके विंडो फ़ंक्शन के रूप में:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... संभवत:यह टिप्पणी करते हुए कि पंक्ति संख्या के साथ और जो आप चाहते हैं उसका चयन करें:
SELECT id AS greatest_id_in_group, avg_last_16_inclusive FROM (
SELECT
id,
avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING) AS avg_last_16_inclusive,
row_number() OVER (ORDER BY id) AS n
FROM the_table
) x WHERE n % 16 = 0;
यह अंतिम n<16 नमूनों की अवहेलना करेगा, उनके लिए एक पंक्ति नहीं लौटाएगा।
ध्यान दें कि मैं मान रहा हूं कि आईडी को सन्निहित होने की गारंटी नहीं है। यदि वे अंतर-रहित हैं, तो आप केवल group by id/16
. कर सकते हैं और विंडो फ़ंक्शन से बचें।