Window function tính toán trên một tập hàng liên quan tới hàng hiện tại nhưng không gộp các hàng lại — mỗi hàng gốc vẫn được giữ, kèm thêm giá trị tính được. Nhận biết qua mệnh đề OVER (...).
Khác GROUP BY:
- GROUP BY gộp nhiều hàng thành một hàng/nhóm → mất chi tiết từng hàng.
- Window function giữ nguyên số hàng, thêm cột tính theo "cửa sổ".
Thành phần trong OVER:
- PARTITION BY: chia hàng thành nhóm (như GROUP BY nhưng không thu gọn).
- ORDER BY: sắp thứ tự trong cửa sổ (cần cho hàm xếp hạng và tổng lũy kế).
Hàm hay dùng:
- Xếp hạng: ROW_NUMBER(), RANK(), DENSE_RANK().
- Tổng hợp theo cửa sổ: SUM() OVER(...), AVG() OVER(...) — vd tổng lũy kế.
- Truy cập hàng lân cận: LAG(), LEAD() — so với hàng trước/sau.
- Khung (frame): ROWS BETWEEN 2 PRECEDING AND CURRENT ROW — trung bình trượt.
-- Xếp hạng lương trong từng phòng, giữ mọi hàng
SELECT name, dept_id, salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank_in_dept
FROM employees;Dùng khi cần "top N mỗi nhóm", tổng lũy kế, so với hàng trước — những thứ GROUP BY một mình khó làm.