Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

35.10. Người dùng xác định Tổng kèo bóng đá c1

Hàm tổng kèo bóng đá c1 trongPostgreSQLđược thể hiện dưới dạngGiá trị trạng tháiHà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.SumIS một ví dụ về loại tổng kèo bóng đá c1 này.SumBắ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ộtSum12116_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ênSumWill 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óSumvà một số tập kèo bóng đá c1 đơn giản khác nhưMaxmin, 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.

AVG14316_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_accumYê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_aggcung 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.