PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

групиране на всеки N стойности

Първият подход, който идва на ум, е да използвате 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 и избягвайте функцията прозорец.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изгледи на PostgreSQL:Препратка към едно изчисляемо поле в друго изчисляемо поле

  2. Postgresql присвоява заявка за избор на променлива във функцията

  3. Променете празния низ на NULL, когато колоната има ограничение DATE

  4. Задаването на схема в PostgreSQL JDBC изглежда не работи

  5. Как да добавя колона, ако не съществува в PostgreSQL?