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
Cũ sqlfiddle
Hàm tổng hợp chung
Để làm cho nó hoạt động cho bất kỳ ngưỡng nào và 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
cũ
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
!