PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

grupowanie co N wartości

Pierwszym podejściem, które przychodzi mi do głowy, jest użycie row_number() aby opisać tabelę, a następnie pogrupuj blokami po 16 wierszy.

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;

Pamiętaj, że nie musi to obejmować 16 próbek dla ostatniej grupy.

Alternatywnie możesz obliczyć średnią bieżącą za pomocą avg() jako funkcja okna:

SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;

... ewentualnie opisując to numerem wiersza i wybierając te, które chcesz:

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;

To zignoruje ostatnie n<16 próbek, nie zwracając dla nich wiersza.

Pamiętaj, że zakładam, że nie ma gwarancji, że identyfikatory będą ciągłe. Jeśli są bez przerw, możesz po prostu group by id/16 i unikaj funkcji okna.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie o pasujące tagi ciągu

  2. Jak uwzględnić wykluczone wiersze w RETURNING z INSERT ... ON CONFLICT

  3. Railsy:wywołanie .limit(5) zmienia kolejność wyników

  4. Czy mogę używać Parallel.For z poleceniami sql?

  5. Wykonaj MERGE na PostgreSQL 9.5