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

Tính tổng trên các phân vùng với các chức năng cửa sổ

SELECT ts, a, b, c
       , COALESCE(max(a) OVER (PARTITION BY grp_a), 0)
       + COALESCE(max(b) OVER (PARTITION BY grp_b), 0)
       + COALESCE(max(c) OVER (PARTITION BY grp_c), 0) AS special_sum
FROM  (
   SELECT *
         ,count(a) OVER w AS grp_a
         ,count(b) OVER w AS grp_b
         ,count(c) OVER w AS grp_c
   FROM   t
   WINDOW w AS (ORDER BY ts)
   ) sub
ORDER  BY ts;

Đầu tiên, hãy đặt các giá trị thực và theo sau NULL các giá trị trong một nhóm với hàm cửa sổ tổng hợp count() :nó không tăng với NULL giá trị.

Sau đó lấy max() từ mọi nhóm, đến những gì bạn đang tìm kiếm. Tại thời điểm này, bạn cũng có thể sử dụng min() hoặc sum() , vì mỗi nhóm chỉ có một giá trị không rỗng.

COALESCE() bắt NULL giá trị nếu giá trị tổng thể đầu tiên trong thời gian là NULL .

Lưu ý cách tôi chọn ts làm tên cột, vì tôi không sử dụng tên loại cơ sở như time dưới dạng số nhận dạng.

Trường hợp thử nghiệm

Đó cũng là cách mà mọi người nên cung cấp dữ liệu mẫu ngay từ đầu!

CREATE TEMP TABLE t (ts int, a int, b int, c int);

INSERT INTO t VALUES
  (1, 11,   21,   NULL)
 ,(2, 12,   22,   NULL)
 ,(3, 13,   NULL, NULL)
 ,(4, NULL, 23,   32);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy ID trả về trong JPA sau khi chèn truy vấn gốc

  2. Nhận giá trị cột của hàng trước đó trong postgres không thể sử dụng chức năng cửa sổ trong CẬP NHẬT

  3. Đo điểm chuẩn Giải pháp đám mây PostgreSQL được quản lý - Phần thứ tư:Microsoft Azure

  4. Cách tạo chuỗi nếu không tồn tại

  5. Trường hợp có vấn đề khi 'tự động' tải dữ liệu từ S3 vào bảng Redshift không?