PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

mengelompokkan setiap nilai N

Pendekatan pertama yang terlintas dalam pikiran adalah menggunakan row_number() untuk membubuhi keterangan tabel, lalu kelompokkan menurut blok 16 baris.

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;

Perhatikan bahwa ini tidak harus menyertakan 16 sampel untuk grup terakhir.

Sebagai alternatif, Anda dapat menghitung rata-rata berjalan dengan menggunakan avg() sebagai fungsi jendela:

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

... mungkin membubuhi keterangan itu dengan nomor baris dan memilih yang Anda inginkan:

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;

Ini akan mengabaikan n<16 sampel terakhir, tidak mengembalikan satu baris untuk mereka.

Perhatikan bahwa saya berasumsi ID tidak dijamin bersebelahan. Jika mereka tidak memiliki celah, Anda cukup group by id/16 dan hindari fungsi jendela.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres adalah database paling keren – Alasan #1:Pengembang menyukainya!

  2. Deklarasikan variabel tipe baris di PL/pgSQL

  3. Proses eksekusi fungsi Postgresql

  4. Berikan pernyataan yang disiapkan dengan array

  5. Ukuran indeks PostgreSQL dan nomor nilai