PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

nhóm mọi giá trị N

Cách tiếp cận đầu tiên mà bạn nghĩ đến là sử dụng row_number() để chú thích bảng, sau đó nhóm theo khối gồm 16 hàng.

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;

Lưu ý rằng điều này không nhất thiết phải bao gồm 16 mẫu cho nhóm cuối cùng.

Ngoài ra, bạn có thể tính toán trung bình chạy bằng cách sử dụng avg() như một chức năng cửa sổ:

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

... có thể chú thích điều đó bằng số hàng và chọn những hàng bạn muốn:

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;

Điều này sẽ bỏ qua n <16 mẫu cuối cùng, không trả lại một hàng cho chúng.

Lưu ý rằng tôi đang giả định rằng các ID không được đảm bảo liền kề. Nếu chúng không có khoảng cách, bạn chỉ có thể group by id/16 và tránh chức năng cửa sổ.



  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 - thêm cột boolean vào bảng đặt mặc định

  2. Khóa ngoại + kế thừa bảng trong PostgreSQL?

  3. LoạiORM Bộ lọc OneToMany trong quan hệ không có hiệu lực để dẫn đến kết quả

  4. psycopg2 + pgbouncer. Chế độ không đồng bộ với lỗi gevent

  5. Cách lấy Ngày và Giờ hiện tại (Không có Múi giờ) trong PostgreSQL