Den første tilgang, der kommer til at tænke på, er at bruge row_number()
for at kommentere tabellen, og grupper derefter efter blokke med 16 rækker.
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;
Bemærk, at dette ikke nødvendigvis inkluderer 16 prøver for den sidste gruppe.
Alternativt kan du beregne et løbende gennemsnit ved at bruge avg()
som en vinduesfunktion:
SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;
... eventuelt anmærke det med rækkenummeret og vælge dem, du ønsker:
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;
Dette vil se bort fra de sidste n<16 prøver, ikke returnere en række for dem.
Bemærk, at jeg går ud fra, at ID'erne ikke garanteres at være sammenhængende. Hvis de er uden mellemrum, kan du bare group by id/16
og undgå vinduesfunktionen.