Hàm tổng kèo bóng đá euro trongPostgreSQLđược xác định theo thuật ngữGiá trị trạng tháivàHàm chuyển tiếp trạng thái. Đó là, một tổng kèo bóng đá euro hoạt động bằng cách sử dụng giá trị trạng thái được cập nhật khi mỗi hàng đầu vào liên tiếp được xử lý.Hàm cuối cùngcũng có thể được chỉ định, trong trường kèo bóng đá euro kết quả mong muốn của tổng kèo bóng đá euro khác với dữ liệu cần được giữ trong giá trị trạng thái đang chạy. Hàm cuối cùng lấy giá trị trạng thái kết thúc và trả về bất cứ điều gì mong muốn là kết quả tổng kèo bóng đá euro.
Do đó, ngoài các loại dữ liệu đối số và kết quả được nhìn thấy bởi người dùng tổng kèo bóng đá euro, còn có một loại dữ liệu giá trị trạng thái bên trong có thể khác với cả hai loại đối số và kết quả.
Nếu chúng ta xác định một tổng kèo bóng đá euro không sử dụng hàm cuối cùng, chúng ta có một tổng kèo bóng đá euro tính toán hàm chạy của các giá trị cột từ mỗi hàng.Sum
là một ví dụ về loại tổng kèo bóng đá euro này.Sum
Bắt đầu ở mức 0 và luôn thêm giá trị của hàng hiện tại vào tổng số chạy của nó. Ví dụ: nếu chúng ta muốn tạo mộtSum
Tổng kèo bóng đá euro để hoạt động trên một loại dữ liệu cho các số phức, chúng tôi chỉ cần chức năng bổ sung cho kiểu dữ liệu đó. Định nghĩa tổng kèo bóng đá euro sẽ là:
Tạo tổng kèo bóng đá euro (phức tạp)
mà chúng ta có thể sử dụng như thế này:
Chọn tổng (a) từ test_complex;
(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 đá euro có tênSum
, nhưngPostgreSQLCó thể tìm ra loại tổng áp dụng cho một cột loạiphức tạp
.)
Định nghĩa trênsum
sẽ trả về số 0 (giá trị trạng thái ban đầu) nếu không có giá trị đầu vào không liên quan. Có lẽ chúng tôi muốn trả lại null trong trường kèo bóng đá euro đó - tiêu chuẩn SQL mong đợiSum
Để 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ỏ quainitCond
Cụm từ để giá trị trạng thái ban đầu là null. Thông thường, điều này có nghĩa làSFUNC
Sẽ cần kiểm tra đầu vào giá trị trạng thái null. Nếu không cóSum
Và một số tập kèo bóng đá euro đơn giản khác nhưMax
vàmin
14866_15034PostgreSQLSẽ tự động thực hiện điều đó nếu giá trị trạng thái ban đầu là NULL và hàm chuyển tiếp được đánh dấunghiê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 Anghiêm ngặtHàm chuyển tiếp là giá trị trạng thái trước đó được giữ lại không thay đổi bất cứ khi nào gặp phải giá trị đầu vào null. Do đó, các giá trị null bị bỏ qua.
AVG
(Trung bình) là một ví dụ phức tạp hơn về một tổng kèo bóng đá euro. Nó yêu cầu hai phần trạng thái chạy: tổng của các đầu vào và số lượng của số lượng đầu vào.AVG (float8)
Trông giống như:
Tạo AVG tổng kèo bóng đá euro (Float8)
float8_accum
Yêu cầu một mảng ba phần tử, không chỉ hai phần tử, bởi vì nó tích lũy tổng 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ập kèo bóng đá euro khác cũng nhưAVG
.
Các cuộc gọi chức năng tổng kèo bóng đá euro trong SQL cho phépkhác biệt
vàĐặt hàng bởi
Các tùy chọn kiểm soát các hàng nào được đưa vào chức năng chuyển đổi của tổng kèo bóng đá euro và theo thứ tự nào. Các tùy chọn này được triển khai đằng sau hậu trường và không phải là mối quan tâm của các chức năng hỗ trợ của tổng kèo bóng đá euro.
Để biết thêm chi tiết, xemTạo tổng kèo bóng đá eurolệnh.
Hàm tổng kèo bóng đá euro có thể hỗ trợ tùy ýChế độ di chuyển-tổng kèo bóng đá euro, cho phép thực hiện nhanh hơn các hàm tổng kèo bóng đá euro trong Windows với các điểm bắt đầu khung di chuyển. (Nhìn thấyPhần 3.5vàPhần 4.2.8Để biết thông tin về việc sử dụng các hàm tổng kèo bóng đá euro làm chức năng cửa sổ.) Ý tưởng cơ bản là ngoài bình thườngHồiChuyển tiếpHàm chuyển tiếp, tổng kèo bóng đá euro cung cấp mộtHàm chuyển tiếp nghịch đảo, cho phép các hàng được xóa khỏi giá trị trạng thái chạy của tổng kèo bóng đá euro khi chúng thoát khỏi khung cửa sổ. Ví dụ ASum
Tổng kèo bóng đá euro, sử dụng bổ sung làm hàm chuyển tiếp phía trước, sẽ sử dụng phép trừ làm hàm chuyển đổi nghịch đảo. Nếu không có chức năng chuyển đổi nghịch đảo, cơ chế chức năng cửa sổ phải tính toán lại tổng kèo bóng đá euro từ đầu mỗi lần điểm bắt đầu khung di chuyển, dẫn đến thời gian chạy tỷ lệ thuận với số lượng hàng đầu vào thời gian chiều dài khung trung bình.
Hàm chuyển đổi nghịch đảo được truyền giá trị trạng thái hiện tại và giá trị đầu vào tổng kèo bóng đá euro cho hàng sớm nhất được bao gồm trong trạng thái hiện tại. Nó phải xây dựng lại giá trị trạng thái sẽ là gì nếu hàng đầu vào đã cho chưa bao giờ được tổng kèo bóng đá euro, nhưng chỉ các hàng theo nó.
Ví dụ, chúng ta có thể mở rộngSum
Tổng kèo bóng đá euro được đưa ra ở trên để hỗ trợ chế độ tổng kèo bóng đá euro di chuyển như thế này:
Tạo tổng kèo bóng đá euro (phức tạp)
Các tham số có tên bắt đầu bằngM
Xác định việc thực hiện tổng kèo bóng đá euro di chuyển. Ngoại trừ chức năng chuyển đổi nghịch đảominvfunc
, chúng tương ứng với các tham số tổng kèo bóng đá euro đơn giản mà không cóM
.
Hàm chuyển tiếp chuyển tiếp cho chế độ tổng kèo bóng đá euro di chuyển không được phép trả về null làm giá trị trạng thái mới. Nếu hàm chuyển đổi nghịch đảo trả về NULL, thì đây được coi là một dấu hiệu cho thấy hàm nghịch đảo không thể đảo ngược tính toán trạng thái cho đầu vào cụ thể này và do đó, tính toán tổng kèo bóng đá euro sẽ được làm lại từ đầu cho vị trí bắt đầu khung hiện tại.HồipuntVề những trường kèo bóng đá euro này, nhưng vẫn đi trước miễn là nó có thể hoạt động trong hầu hết các trường kèo bóng đá euro. Ví dụ, một tổng kèo bóng đá euro làm việc với các số điểm nổi có thể chọn punt khiNAN
(không phải là một số) đầu vào phải được xóa khỏi giá trị trạng thái đang chạy.
Khi viết các chức năng hỗ trợ tổng kèo bóng đá euro di chuyển, điều quan trọng là phải chắc chắn rằng hàm chuyển đổi nghịch đảo có thể xây dựng lại chính xác giá trị trạng thái chính xác. Nếu không, có thể có sự khác biệt có thể nhìn thấy người dùng trong kết quả tùy thuộc vào việc chế độ tổng kèo bóng đá euro chuyển động được sử dụng.Sum
Overfloat4
hoặcfloat8
Đầu vào. Một tuyên bố ngây thơ củasum (
có thểfloat8
)
Tạo tổng kèo bóng đá euro không an toàn_sum (float8)
Tuy nhiên, tổng kèo bóng đá euro này có thể cho kết quả cực kỳ khác nhau so với nếu không có chức năng chuyển đổi nghịch đảo. Ví dụ, xem xét
Chọn
Truy vấn này trả về0
là kết quả thứ hai của nó, thay vì câu trả lời dự kiến của1
. Nguyên nhân là độ chính xác hạn chế của các giá trị điểm nổi: thêm1
đến1E20
Kết quả trong1E20
Một lần nữa, và do đó trừ1E20
Từ đó sản lượng0
, không1
. Lưu ý rằng đây là một hạn chế của số học dấu phẩy động nói chung, không phải là giới hạn củaPostgreSQL.
Các hàm tổng kèo bóng đá euro có thể sử dụng các hàm chuyển đổi trạng thái đa hình hoặc các hàm cuối cùng, do đó có thể sử dụng các hàm tương tự để thực hiện nhiều tập kèo bóng đá euro. Nhìn thấyPhần 37.2.5Để giải thích các hàm đa hình. Đi thêm một bước nữa, chính hàm tổng kèo bóng đá euro 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 đá euro duy nhất phục vụ cho nhiều loại dữ liệu đầu vào.
Tạo tổng kèo bóng đá euro Array_Accum (AnyEuity)
Ở đây, loại trạng thái thực tế cho bất kỳ cuộc gọi tổng kèo bóng đá euro nào là loại mảng có loại đầu vào thực tế là các phần tử. Hành vi của tổng kèo bóng đá euro là nối tất cả các đầu vào vào một mảng thuộc loại đó.mả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.)
Đây là đầu ra sử dụng hai loại dữ liệu thực tế khác nhau làm đối số:
Chọn Attrelid :: RegClass, Array_Accum (Attname)
Thông thường, một hàm tổng kèo bóng đá euro có loại kết quả đa hình có loại trạng thái đa hình, như trong ví dụ trên. Điều này là cần thiết bởi vì nếu không hàm cuối cùng không thể được khai báo kèo bóng đá euro lý: nó sẽ cần phải có loại kết quả đa hình nhưng không có loại đối số đa hình, màTạo chức năng
sẽ từ chối với lý do loại kết quả không thể được suy ra từ một cuộc gọi. Nhưng đôi khi thật bất tiện khi sử dụng một loại trạng thái đa hình.Nội bộ
Vì không có cấp độ SQL tương đương với nó. Để giải quyết trường kèo bóng đá euro này, có thể khai báo chức năng cuối cùng là lấy thêmHồigiảHồiCác đối số khớp với các đối số đầu vào của tổng kèo bóng đá euro. Các đối số giả như vậy luôn được truyền dưới dạng giá trị null vì không có giá trị cụ thể nào có sẵn khi hàm cuối cùng được gọi.mảng_agg
là tương đương với
Tạo hàm mảng_agg_transfn (nội bộ, anynonarray)
ở đây,FinalFunc_extra
Tùy chọn Chỉ định rằng hàm cuối cùng nhận được, ngoài giá trị trạng thái, (các) đối số giả tương ứng với (các) đối số đầu vào của tổng kèo bóng đá euro. ThêmAnynonarray
Đối số cho phép khai báomảng_agg_finalfn
Để kèo bóng đá euro lệ.
Có thể thực hiện hàm tổng kèo bóng đá euro để chấp nhận một số lượng đối số khác nhau bằng cách khai báo đối số cuối cùng của nó làVariadic
mảng, theo nhiều thời trang giống như đối với các chức năng thông thường; nhìn thấyPhần 37.4.5. (Các) hàm chuyển đổi của tổng kèo bóng đá euro phải có cùng loại mảng giống như đối số cuối cùng của chúng.Variadic
, nhưng điều này không được yêu cầu nghiêm ngặt.
Tập kèo bóng đá euro Variadic dễ bị lạm dụng liên quan đếnĐặt hàng bởi
Tùy chọn (xemPhần 4.2.7), vì trình phân tích cú pháp không thể biết liệu số lượng đối số thực tế đã được đưa ra trong sự kết kèo bóng đá euro như vậy. Hãy nhớ rằng mọi thứ ở bên phảiĐặt hàng bởi
là một khóa sắp xếp, không phải là một đối số cho tổng kèo bóng đá euro. Ví dụ, trong
Chọn Myaggregate (một đơn đặt hàng của a, b, c) từ ...
Trình phân tích cú pháp sẽ xem đây là một đối số hàm tổng kèo bóng đá euro duy nhất và ba khóa sắp xếp. Tuy nhiên, người dùng có thể có ý định
Chọn MyAggregate (A, B, C Thứ tự của A) từ ...
nếuMyaggregate
là variadic, cả hai cuộc gọi này có thể hoàn toàn kèo bóng đá euro lệ.
Vì cùng một lý do, thật khôn ngoan khi nghĩ hai lần trước khi tạo các hàm tổng kèo bóng đá euro với cùng tên và các số khác nhau của các đối số thông thường.
Các tập kèo bóng đá euro chúng tôi đã mô tả cho đến nay làbình thường”Tổng kèo bóng đá euro.PostgreSQLcũng hỗ trợTập kèo bóng đá euro được đặt hàng, khác với các tập kèo bóng đá euro bình thường theo hai cách chính. Đầu tiên, ngoài các đối số tổng kèo bóng đá euro thông thường được đánh giá một lần trên mỗi hàng đầu vào, một tập kèo bóng đá euro được đặt hàng có thể cótrực tiếpKhănĐối số chỉ được đánh giá một lần trên mỗi hoạt động tổng kèo bóng đá euro. Thứ hai, cú pháp cho các đối số tổng kèo bóng đá euro thông thường chỉ định một thứ tự sắp xếp cho chúng một cách rõ ràng.phần trăm_disc
là tương đương với:
Tạo chức năng đặt hàng_set_transition (nội bộ, anyelement)
Tổng kèo bóng đá euro này mấtfloat8
Đối số trực tiếp (phân số phần trăm) và đầu vào tổng kèo bóng đá euro có thể thuộc bất kỳ loại dữ liệu nào có thể sắp xếp. Nó có thể được sử dụng để có được thu nhập hộ gia đình trung bình như thế này:
Chọn phần trăm_DISC (0,5) trong nhóm (đặt hàng theo thu nhập) từ các hộ gia đình;
ở đây,0.5
là một đối số trực tiếp; Sẽ không có ý nghĩa gì cho phân số phần trăm là một giá trị khác nhau giữa các hàng.
Không giống như trường kèo bóng đá euro cho các tập kèo bóng đá euro bình thường, việc sắp xếp các hàng đầu vào cho một tổng kèo bóng đá euro được đặt hàng làkhôngĐược thực hiện đằng sau hậu trường, nhưng là trách nhiệm của các chức năng hỗ trợ của tổng kèo bóng đá euro. Phương pháp triển khai điển hình là giữ một tham chiếu đếnMạnhTuplesortĐối tượng trong giá trị trạng thái của tổng kèo bóng đá euro, cung cấp các hàng đến vào đối tượng đó, sau đó hoàn thành việc sắp xếp và đọc dữ liệu trong hàm cuối cùng. Thiết kế này cho phép chức năng cuối cùng thực hiện các hoạt động đặc biệt như tiêm bổ sungMạnhGiả thuyếtHàngHàng vào dữ liệu sẽ được sắp xếp. Mặc dù các tập kèo bóng đá euro bình thường thường có thể được triển khai với các chức năng hỗ trợ được viết bằngPL/PGSQLhoặc một ngôn ngữ PL khác, các tập kèo bóng đá euro được đặt hàng thường phải được viết bằng C, vì các giá trị trạng thái của chúng không thể xác định được là bất kỳ loại dữ liệu SQL nào. (Trong ví dụ trên, lưu ý rằng giá trị trạng thái được khai báo là loạiNội bộ
- Đây là điển hình.)
Hàm chuyển đổi trạng thái cho tổng kèo bóng đá euro được đặt hàng nhận được giá trị trạng thái hiện tại cộng với các giá trị đầu vào tổng kèo bóng đá euro cho mỗi hàng và trả về giá trị trạng thái được cập nhật. Đây là định nghĩa tương tự như đối với các tập kèo bóng đá euro bình thường, nhưng lưu ý rằng các đối số trực tiếp (nếu có) không được cung cấp.FinalFunc_extra
được chỉ định) Các giá trị null tương ứng với (các) đầu vào tổng kèo bóng đá euro. Như với các tập kèo bóng đá euro bình thường,FinalFunc_extra
chỉ thực sự hữu ích nếu tổng kèo bóng đá euro là đa hình; Sau đó, (các) đối số giả bổ sung là cần thiết để kết nối loại kết quả của hàm cuối cùng với loại đầu vào của tổng kèo bóng đá euro.
Hiện tại, các tập kèo bóng đá euro được đặt hàng không thể được sử dụng làm hàm cửa sổ và do đó không cần phải hỗ trợ chế độ tổng kèo bóng đá euro di chuyển.
Tùy chọn, hàm tổng kèo bóng đá euro có thể hỗ trợTập kèo bóng đá euro một phần. Ý tưởng về tổng kèo bóng đá euro một phần là chạy chức năng chuyển đổi trạng thái của tổng kèo bóng đá euro trên các tập kèo bóng đá euro con khác nhau của dữ liệu đầu vào một cách độc lập, và sau đó kết kèo bóng đá euro các giá trị trạng thái do các tập kèo bóng đá euro con đó tạo ra cùng một giá trị trạng thái sẽ dẫn đến việc quét tất cả các đầu vào trong một hoạt động.
Để hỗ trợ tập kèo bóng đá euro một phần, định nghĩa tổng kèo bóng đá euro phải cung cấp mộtKết kèo bóng đá euro chức năng, lấy hai giá trị của loại trạng thái tổng kèo bóng đá euro (đại diện cho kết quả tổng kèo bóng đá euro trên hai tập kèo bóng đá euro con của các hàng đầu vào) và tạo ra một giá trị mới của loại trạng thái, thể hiện những gì trạng thái sẽ có sau khi tổng kèo bóng đá euro kết kèo bóng đá euro các tập kèo bóng đá euro đó. Nó không xác định những gì thứ tự tương đối của các hàng đầu vào từ hai bộ sẽ là gì.
như các ví dụ đơn giản,Max
vàmin
Tập kèo bóng đá euro có thể được thực hiện để hỗ trợ tập kèo bóng đá euro một phần bằng cách chỉ định hàm kết kèo bóng đá euro là cùng một hàm so sánh lớn hơn hai hoặc nhỏ hơn được sử dụng làm hàm chuyển tiếp của chúng.Sum
Tập kèo bóng đá euro chỉ cần một hàm bổ sung làm chức năng kết kèo bóng đá euro. (Một lần nữa, điều này giống như hàm chuyển tiếp của chúng, trừ khi giá trị trạng thái rộng hơn kiểu dữ liệu đầu vào.)
Hàm kết kèo bóng đá euro được đối xử giống như một hàm chuyển tiếp xảy ra để lấy giá trị của loại trạng thái, không phải thuộc loại đầu vào cơ bản, làm đối số thứ hai của nó. Cụ thể, các quy tắc để xử lý các giá trị null và các hàm nghiêm ngặt là tương tự nhau.initCond
, hãy nhớ rằng sẽ được sử dụng không chỉ làm trạng thái ban đầu cho mỗi lần chạy tập kèo bóng đá euro một phần, mà còn là trạng thái ban đầu cho hàm kết kèo bóng đá euro, sẽ được gọi để kết kèo bóng đá euro từng kết quả một phần vào trạng thái đó.
Nếu loại trạng thái của tổng kèo bóng đá euro được khai báo làNội bộ
, Trách nhiệm của hàm kết kèo bóng đá euro là kết quả của nó được phân bổ trong bối cảnh bộ nhớ chính xác cho các giá trị trạng thái tổng kèo bóng đá euro. Điều này có nghĩa là đặc biệt là khi đầu vào đầu tiên lànull
Không kèo bóng đá euro lệ khi chỉ trả lại đầu vào thứ hai, vì giá trị đó sẽ ở trong bối cảnh sai và sẽ không có đủ tuổi thọ.
Khi loại trạng thái của tổng kèo bóng đá euro được khai báo làNội bộ
, Nó cũng thường phù kèo bóng đá euro với định nghĩa tổng kèo bóng đá euro để cung cấp mộtChức năng tuần tự hóavà AHàm giảm vấn đề, cho phép giá trị trạng thái như vậy được sao chép từ quy trình này sang quy trình khác. Không có các chức năng này, tập kèo bóng đá euro song song không thể được thực hiện và các ứng dụng trong tương lai như tập kèo bóng đá euro cục bộ/từ xa có thể cũng không hoạt động.
Chức năng tuần tự hóa phải lấy một đối số duy nhất loạiNội bộ
và trả về kết quả của loạibytea
, đại diện cho giá trị trạng thái được đóng gói thành một đốm byte phẳng. Ngược lại, một chức năng giải phóng đảo ngược chuyển đổi đó.bytea
vàNội bộ
37154_37186Nội bộ
. .
Đáng chú ý là đối với một tổng kèo bóng đá euro được thực hiện song song, bản thân tổng kèo bóng đá euro phải được đánh dấuAn toàn song song
. Các dấu hiệu an toàn song song trên các chức năng hỗ trợ của nó không được tư vấn.
Một hàm được viết trong c có thể phát hiện rằng nó được gọi là hàm hỗ trợ tổng kèo bóng đá euro bằng cách gọiAggcheckCallContext
, ví dụ:
if (aggcheckcallcontext (fcinfo, null))
Một lý do để kiểm tra điều này là khi nó đúng với hàm chuyển tiếp, đầu vào đầu tiên phải là giá trị trạng thái tạm thời và do đó có thể được sửa đổi một cách an toàn 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 đá euro an toàn cho một chức năng để sửa đổi đầu vào từng tham chiếu. Cụ thể, các chức năng cuối cùng cho các tập kèo bóng đá euro bình thường không được sửa đổi đầu vào của chúng trong mọi trường kèo bóng đá euro, bởi vì trong một số trường kèo bóng đá euro, chúng sẽ được thực hiện lại trên cùng một giá trị trạng thái cuối cùng.)
Đối số thứ hai củaAggcheckCallContext
có thể được sử dụng để truy xuất bối cảnh bộ nhớ trong đó các giá trị trạng thái tổng kèo bóng đá euro đang được giữ. Điều này hữu ích cho các chức năng chuyển tiếp muốn sử dụngMở rộngĐối tượng (xemPhần 37.11.1) làm giá trị trạng thái của chúng. Trong cuộc gọi đầu tiên, hàm chuyển đổi sẽ trả về một đối tượng mở rộng có ngữ cảnh bộ nhớ là một đứa trẻ của bối cảnh trạng thái tổng kèo bóng đá euro, và sau đó tiếp tục trả về cùng một đối tượng mở rộng trong các cuộc gọi tiếp theo.Array_Append ()
Ví dụ. (mảng_Append ()
không phải là hàm chuyển đổi của bất kỳ tập kèo bóng đá euro tích kèo bóng đá euro nào, nhưng nó được viết để hoạt động hiệu quả khi được sử dụng làm chức năng chuyển tiếp của tập kèo bóng đá euro tùy chỉnh.)
Một thói quen hỗ trợ khác có sẵn cho các hàm tổng kèo bóng đá euro được viết trong C làaggetaggref
, trả vềAggref
Parse Node xác định cuộc gọi tổng kèo bóng đá euro. Điều này chủ yếu hữu ích cho các tập kèo bóng đá euro được đặt hàng, có thể kiểm tra cấu trúc củaAggref
Node để tìm hiểu những gì họ đặt hàng mà họ phải thực hiện. Các ví dụ có thể được tìm thấy trongOrderedSetaggs.c
trongPostgreSQLMã nguồn.