Professional Documents
Culture Documents
PostgreSQL Summary Stats and Window Functions
PostgreSQL Summary Stats and Window Functions
WINDOW FUNCTIONS
Thực hiện thao tác trên một tập hợp các quan sát bằng cách nào đó liên quan đến hàng hiện
tại, là hàng mà chức năng cửa sổ hiện đang hoạt động
Chúng tương tự như các hàm tổng hợp GROUP BY , nhưng thay vì các hàng được nhóm
thành một hàng, tất cả các hàng vẫn ở trong đầu ra
Được sử dụng để
Nạp giá trị từ các hàng trước hoặc sau hàng hiện tại (VD: tính toán sự tang trưởng theo thời
gian)
Chỉ định thứ hạng cho các hàng và tính toán tổng số đang chạy và đường trung bình cộng
FUNCTION_NAME() OVER(…)
OVER: chỉ ra rằng một hàm là một hàm cửa sổ
Các dấu ngoặc đơn sau OVER có thể để trống, nhưng chúng cũng có thể chứa các điều khoản
phụ
ORDER BY
PARTITION BY
ROWS/RANGE PRECEIDING/FOLLOWING/UNBOUNDED
ORDER BY
ORDER BY có thể được đặt cùng lúc trong OVER và bên ngoài OVER
Đầu tiên, ROW_NUMBER sẽ chỉ định các số dựa trên thứ tự trong OVER
Sau đó ORDER bên ngoài OVER sẽ tiếp quản và sắp xếp kết quả của bảng
ODER BY bên trong OVER có hiệu lực trước ORDER BY bên ngoài OVER
LAG
LAG là một hàm cửa sổ có cột và một số n trả về giá trị của cột n hàng trước hàng hiện tại
LAG(column,n) OVER (…)
ABSOLUTE(TUYỆT ĐỐI) : Vì giá trị chúng trả về không phụ thuộc vào hàng hiện tại và tuyệt
đối đối với bảng hoặc phân vùng
FIRST_VALUE(column) trả về giá trị đầu tiên trong bảng hoặc phân vùng
LAST_VALUE(column) trả về giá trị cuối cùng trong bảng hoặc phân vùng
LAST_VALUE:
Theo mặc định, một Window bắt đầu ở bảng hoặc phân vùng và kết thúc ở hàng hiện tại
Nếu không có mệnh đề RANGE BETWEEN, LAST_VALUE sẽ nhận giá trị của hàng hiện tại
Mệnh đề RANGE BETWEEN mở rộng cửa sổ đến cuối bảng hoặc phân vùng để giá trị
thực tế cuối cùng sẽ được tìm nạp
Ranking
The ranking functions:
ROW_NUMBER():
Gán số cho các hàng là một cách để xếp hạng chúng.
ROW_NUMBER luôn chỉ định các số duy nhất, ngay cả khi giá trị của hai hàng giống nhau.
Nó chọn một số chỉ số khác để chỉ định số nếu giá trị mà nó sắp xếp giống nhau(VD: Thứ tự
được chọn nội bộ)
RANK():
Chỉ định cùng một số cho các hàng có giá trị giống hệt nhau, bỏ qua các số tiếp theo trong
những trường hợp như vậy
DENSE_RANK() cũng chỉ định cùng một số cho các hàng với các giá trị giống hệt nhau, nhưng
không bỏ qua các số tiếp theo
MAX
SUM
Frames
Một khung luôn bắt đầu bằng RANGE BETWEEN hoặc ROWS BETWEEN
ROWS BETWEEN:
ROWS BETWEEN [START] AND [FINISH]
[START] và [FINISH] có thể là một trong 3 mệnh đề: PRECEDING, CURRENT FLOW và
FOLLOWING:
n PRECEDING xác định khung là bắt đầu hoặc kết thúc n hàng trước hàng hiện tại
CURRENT ROW là đặt bắt đầu hoặc kết thúc ở hiện tại
n FOLLOWING: đặt ở n hàng sau hàng hiện tại
ROWS vs RANGE
RANGE BETWEEN hoạt động giống như ROWS BETWEEN với một điểm khác biệt chính
RANGE xử lý các bản sao trong các cột trong mệnh đề phụ ORDER BY Dưới dạng thực thể
đơn lẻ trong khi ROWS thì không
Cột ROWS_RT có các giá trị bạn mong đợi, nhưng cột RANGE_RT xử lý các hàng với sao
chép các giá trị dưới dạng các hàng đơn lẻ, tổng cộng chúng trước rồi hiển thị tổng đó cho mỗi
hàng trùng lặp
( Tại vì có hai cái 50 nên cộng vào 100 r hiển thị hai lần
Có hai cái 60 nên cộng vào 120 r hiển thị hai lần)
Trong thực tế ROWS BETWEEN hầu như luôn được sử dụng thay vì RANGE
BETWEEN
Pivoting
Pivoting biến đổi bảng bằng cách tạo các cột từ các giá trị duy nhất của một trong các cột của
bảng đó
Dễ quét hơn, đặc biệt nếu được xoay bởi một cột được sắp xếp theo thứ tự thời gian
CROSSTAB
Cho phép bạn xoay bảng theo một cột nhất định
Bạn sẽ cần sử dụng câu lệnh CREAT EXTENSION trước khi sử dụng CROSSTAB
CREAT EXTENSION làm cho các chức năng bổ sung trong tiện ích mở rộng có sẵn để sử
dụng .Phần mở rộng tablefunc chứa hàm CROSSTAB
Sau đó, đặt truy vấn nguồn(source query) của bạn vào giữa hai cặp ký hiệu $$
Cuối cùng, trong dấu ngoặc đơn sau ct, hãy viết tên cột và loại của bảng xoay vòng mới của
bạn
Tên cột là cột không được xoay và các giá trị duy nhất của cột được xoay
CUBE
CUBE giống như ROLL UP nhưng nó không phân cấp
Tạo ra tất cả tổng hợp cấp nhóm có thể có
CUBE(Country,Medal) tính tổng cấp Country, cấp Medal và Tổng cộng
Sử dụng ROLL UP khi có dữ liệu phân cấp trong các cột. Chẳng hạn như phần ngày tháng
Sử dụng CUBE khi bạn muốn có tất cả các tổng hợp cấp nhóm
STRING_AGG hữu ích khi bạn cần giảm số hàng được trả về