sql >> Database teknologi >  >> RDS >> PostgreSQL

gruppering af hver N-værdi

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.



  1. SUM i LEFT JOIN-forespørgsel

  2. Hvordan deaktiverer jeg SQLAlchemy-caching?

  3. Skinner 5:grupper poster efter DateTime-feltet i trævisning

  4. tsql samlet streng for gruppe efter