Window functions tính toán trên set rows liên quan nhưng không collapse chúng như GROUP BY — mỗi row vẫn giữ nguyên và nhận thêm computed value như ROW_NUMBER, RANK, LAG, running total.
- Window functions tính toán trên window (tập rows liên quan) nhưng KHÔNG collapse rows như GROUP BY — mỗi row giữ nguyên và nhận thêm computed value.
- OVER clause:
PARTITION BYchia thành sub-windows (như GROUP BY nhưng không collapse),ORDER BYxác định thứ tự trong window. - ROW_NUMBER(): số thứ tự duy nhất, không ties.
- RANK(): ties được cùng số, bỏ số sau ties (1,1,3).
- DENSE_RANK(): ties cùng số, không bỏ số (1,1,2).
- LAG/LEAD:
LAG(salary, 1) OVER (ORDER BY hire_date)lấy giá trị row trước — tính month-over-month growth. - Running totals:
SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)— cumulative sum. - Frame specification:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW(3-row moving average),RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW(rolling 7-day window). - FIRST_VALUE/LAST_VALUE: giá trị đầu/cuối của window.
- Practical use case:
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn FROM orders→WHERE rn = 1lấy order mới nhất của mỗi user — pattern deduplication phổ biến.