Postgresql 9.0.23 Tài liệu | ||||
---|---|---|---|---|
prev | UP | Chương 35. Mở rộngSQL | Tiếp theo |
Hàm tổng kèo bóng đá c1 trongPostgreSQLđược thể hiện dưới dạngGiá trị trạng tháivàHàm chuyển tiếp trạng thái10891_11286chức năng cuối cùngcũng có thể được chỉ định, trong trường kèo bóng đá c1 Kết quả mong muốn của tổng kèo bóng đá c1 khác với dữ liệu mà cần được giữ trong giá trị trạng thái đang chạy.
11485_11689
Nếu chúng ta xác định một tổng kèo bóng đá c1 không sử dụng hàm cuối cùng,
Chúng tôi có một tổng kèo bóng đá c1 tính toán một hàm đang chạy của
giá trị cột từ mỗi hàng.Sum
IS
một ví dụ về loại tổng kèo bóng đá c1 này.Sum
Bắt đầu ở 0 và luôn luôn thêm hiện tại
giá trị của hàng với kèo bóng đá c1 số chạy của nó. Ví dụ: nếu chúng ta muốn làm
MộtSum
12116_12266
Tạo tổng kèo bóng đá c1 (phức tạp) . sfunc = Complex_add, stype = phức tạp, initCond = '(0,0)' ); Chọn tổng (a) từ test_complex; tổng ----------- (34,53,9)
(Lưu ý rằng chúng tôi đang dựa vào quá tải chức năng: Có
nhiều hơn một tổng kèo bóng đá c1 có tênSum
,,
NhưngPostgreSQLCó thể tìm ra
Loại kèo bóng đá c1 áp dụng cho một cột loạiphức tạp.)
Định nghĩa trênSum
Will
trả về 0 (điều kiện trạng thái ban đầu) nếu không có
Giá trị đầu vào. Có lẽ chúng ta muốn trả lại null trong trường kèo bóng đá c1 đó
- Tiêu chuẩn SQL mong đợiSum
đến
hành xử theo cách đó. Chúng ta có thể làm điều này chỉ đơn giản bằng cách bỏ quainitcondCụm từ để trạng thái ban đầu
điều kiện là null. Thông thường, điều này có nghĩa làSFUNCSẽ cần kiểm tra NULL
Đầu vào điều kiện trạng thái. Nếu không cóSum
và một số tập kèo bóng đá c1 đơn giản khác nhưMax
vàmin
, Nó
đủ để chèn giá trị đầu vào không liên quan đầu tiên vào
Biến trạng thái và sau đó bắt đầu áp dụng chức năng chuyển tiếp tại
giá trị đầu vào không liên quan thứ hai.POSTGRESQLsẽ tự động làm điều đó nếu
Điều kiện ban đầu là null và chức năng chuyển tiếp được đánh dấu"nghiêm ngặt"(tức là, không được gọi cho
đầu vào null).
Một chút hành vi mặc định khác cho A"nghiêm ngặt"Hàm chuyển tiếp là trước đó Giá trị trạng thái được giữ lại không thay đổi bất cứ khi nào giá trị đầu vào null gặp phải. kèo bóng đá c1 đó, các giá trị null bị bỏ qua. Nếu bạn cần một số hành vi khác cho đầu vào null, không tuyên bố quá trình chuyển đổi của bạn chức năng là nghiêm ngặt; thay vào đó mã hóa nó để kiểm tra các đầu vào null và làm bất cứ điều gì cần thiết.
AVG
14316_14658AVG (float8)
Trông giống như:
Tạo AVG tổng kèo bóng đá c1 (Float8) . sfunc = float8_accum, stype = float8 [], FinalFunc = float8_avg, initCond = '0,0,0' );
(float8_accum
Yêu cầu a
Mảng ba phần tử, không chỉ hai yếu tố, bởi vì nó
tích lũy tổng các bình phương cũng như tổng và số lượng của
các đầu vào. Điều này là để nó có thể được sử dụng cho một số
tổng kèo bóng đá c1 bên cạnhAVG
.)
15201_15371Phần 35.2.5Để giải thích các hàm đa hình. Đi a Bước xa hơn, chính chức năng tổng kèo bóng đá c1 có thể được chỉ định với loại đầu vào đa hình và loại trạng thái, cho phép một Định nghĩa tổng kèo bóng đá c1 để phục vụ cho nhiều loại dữ liệu đầu vào. Đây là một ví dụ về tập kèo bóng đá c1 đa hình:
Tạo tổng kèo bóng đá c1 Array_Accum (AnyEuity) . sfunc = mảng_Append, Stype = AnyArray, initCond = '' );
Ở đây, loại trạng thái thực tế cho bất kỳ cuộc gọi tổng kèo bóng đá c1 nào là
Loại mảng có loại đầu vào thực tế là các yếu tố. Hành vi
của tổng kèo bóng đá c1 là để kết kèo bóng đá c1 tất cả các đầu vào vào một mảng
thuộc loại đó. (Lưu ý: Tổng kèo bóng đá c1 tích kèo bóng đá c1mảng_agg
cung cấp chức năng tương tự, với
Hiệu suất tốt hơn định nghĩa này sẽ có.)
Đây là đầu ra sử dụng hai loại dữ liệu thực tế khác nhau Đối số:
Chọn Attrelid :: RegClass, Array_Accum (Attname) Từ pg_attribution WHERE attnum 0 và attrelid = 'pg_tablespace' :: regclass Nhóm của Attrelid; ATTRELID | Array_Accum ---------------+------------------------------------------- pg_tablespace | spcname, spcowner, spcloc, spcacl
Một hàm được viết trong C có thể phát hiện rằng nó đang được gọi là
Chuyển đổi tổng kèo bóng đá c1 hoặc chức năng cuối cùng bằng cách gọiAggcheckCallContext
, ví dụ:
if (aggcheckcallcontext (fcinfo, null))
Một lý kèo bóng đá c1 để kiểm tra điều này là khi nó đúng với chức năng chuyển tiếp, đầu vào đầu tiên phải là tạm thời giá trị chuyển tiếp và kèo bóng đá c1 đó có thể được sửa đổi một cách an toàn tại chỗ thay vì phân bổ một bản sao mới. Nhìn thấyint8inc ()Ví dụ. (Đây làchỉtrường kèo bóng đá c1 nó ở đâu An toàn cho một chức năng để sửa đổi đầu vào từng tham chiếu. TRONG đặc biệt, các chức năng cuối cùng tổng kèo bóng đá c1 không nên sửa đổi đầu vào trong mọi trường kèo bóng đá c1, bởi vì trong một số trường kèo bóng đá c1, chúng sẽ được thực hiện lại trên cùng một giá trị chuyển tiếp cuối cùng.)
Để biết thêm chi tiết, xemTạo tổng kèo bóng đá c1lệnh.