PostgreSQL: soi kèo bóng đá | |||
---|---|---|---|
prev | UP | Chương 35. Mở rộngSQL | Tiếp theo |
Hàm tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay kết quả mong muốn của tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 cuối cùng và trả về bất cứ điều gì muốn là kết quả tổng tỷ lệ kèo bóng đá trực tuyến hôm nay.
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 tỷ lệ kèo bóng đá trực tuyến hôm nay, 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ả loại đối số và kết quả.
Nếu chúng ta xác định một tập tỷ lệ kèo bóng đá trực tuyến hôm nay không sử dụng hàm cuối cùng, chúng ta có một tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay này.Sum
Bắt đầu ở 0 và luôn thêm giá trị của hàng hiện tại vào tỷ lệ kèo bóng đá trực tuyến hôm nay số chạy của nó. Ví dụ: nếu chúng ta muốn tạo mộtSum
Tổng tỷ lệ kèo bóng đá trực tuyến hôm nay để 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 tỷ lệ kèo bóng đá trực tuyến hôm nay sẽ là:
Tạo tổng tỷ lệ kèo bóng đá trực tuyến hôm nay (phức tạp)
mà chúng ta có thể sử dụng như thế này:
Chọn tỷ lệ kèo bóng đá trực tuyến hôm nay (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 tỷ lệ kèo bóng đá trực tuyến hôm nay có tênSum
, nhưngPostgreSQLCó thể tìm ra loại tỷ lệ kèo bóng đá trực tuyến hôm nay áp dụng cho một cột loạiphức tạp.)
Định nghĩa trênSum
sẽ trả về 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 tỷ lệ kèo bóng đá trực tuyến hôm nay đó - 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ỏ quainitCondCụm từ để giá trị trạng thái ban đầu là null. Thông thường, điều này có nghĩa làSFUNCsẽ 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 tỷ lệ kèo bóng đá trực tuyến hôm nay đơn giản khác nhưMax
vàmin
13734_13902PostgreSQLsẽ 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ấ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à 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 tỷ lệ kèo bóng đá trực tuyến hôm nay. 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 tỷ lệ kèo bóng đá trực tuyến hôm nay (Float8)
Lưu ý:
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 tỷ lệ kèo bóng đá trực tuyến hôm nay khác cũng nhưAVG
.
Các cuộc gọi chức năng tổng tỷ lệ kèo bóng đá trực tuyến hôm nay trong SQL cho phépkhác biệtvàĐặt hàng bởiCá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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay.
Để biết thêm chi tiết, xemPostgreSQL: Tài liệu: 9.5: Tạo tổng kèolệnh.
Các chức năng tổng tỷ lệ kèo bóng đá trực tuyến hôm nay có thể tùy chọn hỗ trợChế độ tập tỷ lệ kèo bóng đá trực tuyến hôm nay di chuyển, cho phép thực hiện nhanh hơn các hàm tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay làm chức năng cửa sổ.) Ý tưởng cơ bản là ngoài bình thường"Chuyển tiếp"Hàm chuyển tiếp, tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay khi chúng thoát khỏi khung cửa sổ. Ví dụ ASum
Tập tỷ lệ kèo bóng đá trực tuyến hôm nay, 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay, nhưng chỉ các hàng theo nó.
Ví dụ, chúng ta có thể mở rộngSum
Tổng tỷ lệ kèo bóng đá trực tuyến hôm nay được đưa ra ở trên để hỗ trợ chế độ tổng tỷ lệ kèo bóng đá trực tuyến hôm nay di chuyển như thế này:
Tạo tổng tỷ lệ kèo bóng đá trực tuyến hôm nay (phức tạp)
Các tham số có tên bắt đầu bằngMXác định việc thực hiện tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay đơn giản mà không cóM.
Hàm chuyển tiếp chuyển tiếp cho chế độ tổng tỷ lệ kèo bóng đá trực tuyến hôm nay di chuyển không được phép trả lại 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 tỷ lệ kèo bóng đá trực tuyến hôm nay sẽ được làm lại từ đầu cho vị trí bắt đầu khung hiện tại."punt"Về những trường tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay. Ví dụ, một tổng tỷ lệ kèo bóng đá trực tuyến hôm nay làm việc với các số điểm nổi có thể chọn punt khiNAN(không phải là 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay chuyển động được sử dụng.sum
Overfloat4hoặcfloat8Đầu vào. Một tuyên bố ngây thơ củasum (float8)
có thể là
Tạo tổng tỷ lệ kèo bóng đá trực tuyến hôm nay không an toàn_sum (float8)
Tuy nhiên, tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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ề0là 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đến1E20Kết quả trong1E20Một lần nữa, và do đó trừ1E20Từ đó 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay. Nhìn thấyPhần 35.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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay duy nhất phục vụ cho nhiều loại dữ liệu đầu vào.
Tạo tổng tỷ lệ kèo bóng đá trực tuyến hôm nay Array_Accum (AnyEuity)
Ở đây, loại trạng thái thực tế cho bất kỳ cuộc gọi tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay với 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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ăngsẽ 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ộBởi vì không có cấp độ SQL tương đương với nó. Để giải quyết trường tỷ lệ kèo bóng đá trực tuyến hôm nay này, có thể khai báo chức năng cuối cùng là lấy thêm"giả"Các đối số khớp với các đối số đầu vào của tổng tỷ lệ kèo bóng đá trực tuyến hôm nay. 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_extraTù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 tỷ lệ kèo bóng đá trực tuyến hôm nay. ThêmAnynonarrayĐối số cho phép khai báomảng_agg_finalfn
Để tỷ lệ kèo bóng đá trực tuyến hôm nay lệ.
Có thể thực hiện một hàm tổng tỷ lệ kèo bóng đá trực tuyến hôm nay để 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àVariadicmảng, theo kiểu giống như đối với các chức năng thông thường; nhìn thấyPhần 35.4.5. (Các) hàm chuyển đổi của tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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.
Lưu ý:Tập tỷ lệ kèo bóng đá trực tuyến hôm nay Variadic dễ bị lạm dụng liên quan đếnĐặt hàng bởiTù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 tỷ lệ kèo bóng đá trực tuyến hôm nay như vậy. Hãy nhớ rằng mọi thứ ở bên phảiĐặt hàng bởilà một khóa sắp xếp, không phải là một đối số cho tổng tỷ lệ kèo bóng đá trực tuyến hôm nay. 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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ếuMyaggregatelà variadic, cả hai cuộc gọi này có thể hoàn toàn tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay chúng tôi đã mô tả cho đến nay là"Bình thường"Tổng tỷ lệ kèo bóng đá trực tuyến hôm nay.PostgreSQLcũng hỗ trợTập tỷ lệ kèo bóng đá trực tuyến hôm nay được đặt hàng, khác với các tập tỷ lệ kèo bóng đá trực tuyến hôm nay bình thường theo hai cách chính. Đầu tiên, ngoài các đối số tổng tỷ lệ kèo bóng đá trực tuyến hôm nay thông thường được đánh giá một lần trên mỗi hàng đầu vào, một tập tỷ lệ kèo bóng đá trực tuyến hôm nay được đặt hàng có thể có"Direct"Các đối số chỉ được đánh giá một lần trên mỗi hoạt động tổng tỷ lệ kèo bóng đá trực tuyến hôm nay. Thứ hai, cú pháp cho các đối số tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay này mấtfloat8Đối số trực tiếp (phân số phần trăm) và đầu vào tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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.5là 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 tỷ lệ kèo bóng đá trực tuyến hôm nay cho các tập tỷ lệ kèo bóng đá trực tuyến hôm nay bình thường, việc sắp xếp các hàng đầu vào cho một tổng tỷ lệ kèo bóng đá trực tuyến hôm nay đượ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 tỷ lệ kèo bóng đá trực tuyến hôm nay. Phương pháp triển khai điển hình là giữ một tham chiếu đến"Tuplesort"Đối tượng trong giá trị trạng thái của tổng tỷ lệ kèo bóng đá trực tuyến hôm nay, 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ổ sung"Giả thuyết"Hàng vào dữ liệu sẽ được sắp xếp. Mặc dù các tập tỷ lệ kèo bóng đá trực tuyến hôm nay 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 ngôn ngữ PL khác, các tập tỷ lệ kèo bóng đá trực tuyến hôm nay đượ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 tỷ lệ kèo bóng đá trực tuyến hôm nay đượ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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay. Như với các tập tỷ lệ kèo bóng đá trực tuyến hôm nay bình thường,FinalFunc_extrachỉ thực sự hữu ích nếu tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay.
Hiện tại, các tập tỷ lệ kèo bóng đá trực tuyến hôm nay được đặt hàng không thể được sử dụng làm chức năng cửa sổ và do đó không cần phải hỗ trợ chế độ tổng tỷ lệ kèo bóng đá trực tuyến hôm nay di chuyển.
Một hàm được viết trong c có thể phát hiện rằng nó được gọi là chuyển đổi tổng tỷ lệ kèo bóng đá trực tuyến hôm nay 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ý 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 tỷ lệ kèo bóng đá trực tuyến hôm nay 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 tỷ lệ kèo bóng đá trực tuyến hôm nay bình thường không được sửa đổi đầu vào của chúng trong mọi trường tỷ lệ kèo bóng đá trực tuyến hôm nay, bởi vì trong một số trường tỷ lệ kèo bóng đá trực tuyến hôm nay, 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 tỷ lệ kèo bóng đá trực tuyến hôm nay đ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ụng"Mở rộng"Đối tượng (xemPhần 35.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 tỷ lệ kèo bóng đá trực tuyến hôm nay, 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ụ. (Array_Append ()
không phải là hàm chuyển tiếp của bất kỳ tập tỷ lệ kèo bóng đá trực tuyến hôm nay tích tỷ lệ kèo bóng đá trực tuyến hôm nay 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 một tập tỷ lệ kèo bóng đá trực tuyến hôm nay tùy chỉnh.)
Một thói quen hỗ trợ khác có sẵn cho các hàm tổng tỷ lệ kèo bóng đá trực tuyến hôm nay được viết trong C làaggetaggref
, trả vềAggrefParse Node xác định cuộc gọi tổng tỷ lệ kèo bóng đá trực tuyến hôm nay. Điều này chủ yếu hữu ích cho các tập tỷ lệ kèo bóng đá trực tuyến hôm nay được đặt hàng, có thể kiểm tra cấu trúc củaAggrefNode để 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.cTrongPOSTGRESQLMã nguồn.