Skip to content

Hàm cửa sổ SQL được giải thích

Mọi hàm cửa sổ SQL phổ biến cùng các mệnh đề điều khiển chúng, nhóm theo công việc: xếp hạng các hàng, nhìn các hàng liền kề, tính tổng tích lũy qua một khung, và lấy giá trị đầu hoặc cuối. Mỗi dòng ghép hàm với một ví dụ một dòng.

Hàm cửa sổ tính toán kết quả trên các hàng liên quan đến hàng hiện tại mà không gộp chúng lại như GROUP BY. Mọi hàm cửa sổ đều kết thúc bằng mệnh đề OVER định nghĩa cửa sổ: PARTITION BY nhóm các hàng, ORDER BY sắp xếp chúng, và khung tùy chọn giới hạn tập trượt. Nắm vững OVER, phần còn lại chỉ là từ vựng.

Bảng tham chiếu · 27 mục
27 of 27 rows
Xếp hạng
Một số nguyên tuần tự duy nhất cho mỗi hàng trong cửa sổ.ROW_NUMBER() OVER (ORDER BY total DESC)
Xếp hạng có khoảng trống; các hàng bằng nhau chung hạng và bỏ qua các số tiếp theo.RANK() OVER (ORDER BY total DESC)
Xếp hạng không khoảng trống; các hàng bằng nhau chung hạng và không bỏ sót số nào.DENSE_RANK() OVER (ORDER BY total DESC)
Chia cửa sổ đã sắp xếp thành n nhóm xấp xỉ bằng nhau.NTILE(4) OVER (ORDER BY total DESC)
Nhìn các hàng liền kề
Giá trị của n hàng phía trước; giá trị mặc định thay thế khi không có hàng như vậy.LAG(total, 1, 0) OVER (ORDER BY created_at)
Giá trị của n hàng phía sau; giá trị mặc định thay thế khi không có hàng như vậy.LEAD(total, 1, 0) OVER (ORDER BY created_at)
Tổng hợp trên cửa sổ
Tổng tích lũy hoặc theo phân vùng mà không gộp các hàng.SUM(total) OVER (ORDER BY created_at)
Trung bình tích lũy hoặc theo phân vùng.AVG(total) OVER (PARTITION BY user_id)
Số hàng tích lũy hoặc theo phân vùng.COUNT(*) OVER (PARTITION BY user_id)
Giá trị nhỏ nhất trên toàn cửa sổ hoặc phân vùng.MIN(total) OVER (PARTITION BY user_id)
Giá trị lớn nhất trên toàn cửa sổ hoặc phân vùng.MAX(total) OVER (PARTITION BY user_id)
SUM với ORDER BY và khung mở từ điểm bắt đầu; mỗi hàng cộng dồn mọi giá trị đến chính nó.SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG trên khung gồm n hàng trước và sau hàng hiện tại.AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Giá trị đầu, cuối và phân vị
Giá trị đầu tiên trong thứ tự sắp xếp của cửa sổ.FIRST_VALUE(total) OVER (ORDER BY total DESC)
Giá trị cuối cùng trong khung; nếu không có UNBOUNDED FOLLOWING, khung dừng ở hàng hiện tại.LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Giá trị tại hàng thứ n của thứ tự sắp xếp cửa sổ.NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Thứ hạng tương đối của một hàng, từ 0 đến 1.PERCENT_RANK() OVER (ORDER BY total)
Tỷ lệ các hàng đến hoặc trước hàng hiện tại, từ 1/n đến 1.CUME_DIST() OVER (ORDER BY total)
Mệnh đề OVER
Định nghĩa cửa sổ mà mọi hàm đọc.<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Khởi động lại cửa sổ cho từng nhóm hàng.PARTITION BY user_id
Sắp xếp thứ tự các hàng trong mỗi phân vùng.ORDER BY created_at
Giới hạn khung trượt, ví dụ từ các hàng phía trước đến các hàng phía sau.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Giới hạn khung theo giá trị, không theo vị trí hàng; CURRENT ROW gồm cả các hàng bằng nhau, và đây là khung mặc định khi có ORDER BY.RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Giới hạn khung theo các nhóm hàng bằng nhau từ ORDER BY.GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Loại hàng hiện tại khỏi khung; còn EXCLUDE TIES thì loại các hàng bằng nó.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Đặt tên cho cửa sổ một lần mỗi truy vấn để nhiều mệnh đề OVER dùng lại.WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Thu hẹp các hàng mà hàm tổng hợp cửa sổ đọc, trước khi cửa sổ được áp dụng.SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)