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

Cộng dồn tích lũy với cơ sở động trong Postgres

Tạo hàm tổng hợp của riêng bạn , có thể được sử dụng như chức năng cửa sổ.

Chức năng tổng hợp chuyên biệt

Nó dễ dàng hơn người ta nghĩ:

CREATE OR REPLACE FUNCTION f_sum_cap50 (numeric, numeric)
  RETURNS numeric LANGUAGE sql AS
'SELECT CASE WHEN $1 > 50 THEN 0 ELSE $1 END + $2';

CREATE AGGREGATE sum_cap50 (numeric) (
  sfunc    = f_sum_cap50
, stype    = numeric
, initcond = 0
);

Sau đó:

SELECT *, sum_cap50(val) OVER (PARTITION BY fk
                               ORDER BY created) > 50 AS threshold_met 
FROM   test
WHERE  fk = 5;

Kết quả đúng như yêu cầu.

db <> fiddle tại đây
sqlfiddle

Hàm tổng hợp chung

Để làm cho nó hoạt động cho bất kỳ ngưỡng nào bất kỳ kiểu dữ liệu (số) nào và cũng cho phép NULL giá trị :

CREATE OR REPLACE FUNCTION f_sum_cap (anyelement, anyelement, anyelement)
  RETURNS anyelement
  LANGUAGE sql STRICT AS
$$SELECT CASE WHEN $1 > $3 THEN '0' ELSE $1 END + $2;$$;

CREATE AGGREGATE sum_cap (anyelement, anyelement) (
  sfunc    = f_sum_cap
, stype    = anyelement
, initcond = '0'
);

Sau đó, để gọi với giới hạn, giả sử, 110 với bất kỳ loại số nào:

SELECT *
     , sum_cap(val, '110') OVER (PARTITION BY fk
                                 ORDER BY created) AS capped_at_110
     , sum_cap(val, '110') OVER (PARTITION BY fk
                                 ORDER BY created) > 110 AS threshold_met 
FROM   test
WHERE  fk = 5;

db <> fiddle tại đây
sqlfiddle

Giải thích

Trong trường hợp của bạn, chúng tôi không phải bảo vệ chống lại NULL các giá trị kể từ val được định nghĩa NOT NULL . Nếu NULL có thể được tham gia, xác định f_sum_cap() dưới dạng STRICT và nó hoạt động vì ( theo tài liệu ):

Cả hàm và tổng hợp có thêm một đối số. Đối với đa hình biến thể nó có thể là kiểu dữ liệu được mã hóa cứng hoặc kiểu đa hình giống như các đối số hàng đầu.

Về các hàm đa hình:

Lưu ý việc sử dụng ký tự chuỗi không định kiểu , không phải ký tự số, sẽ mặc định thành integer !




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa `->>` và `->` trong Postgres SQL là gì?

  2. 'thứ' và 'cho đường dẫn xml (' ')' từ SQL Server trong Postgresql

  3. Vấn đề sắp xếp postgres

  4. psycopg2.ProgrammingError:lỗi cú pháp tại hoặc gần lỗi stdin khi cố gắng copy_from redshift

  5. Django ORM so sánh bộ tuples / thứ tự từ vựng