
Chia sẻ
"Tìm hiểu Window Functions (ROW_NUMBER, RANK, LAG, LEAD) và CTE trong SQL. Kèm bài tập thực hành với PostgreSQL."
Tại sao cần Window Functions?
Aggregate functions (SUM, COUNT...) gộp dữ liệu. Nhưng đôi khi bạn muốn vừa tính tổng vừa giữ nguyên chi tiết từng dòng → Window Functions!
ROW_NUMBER — Đánh số thứ tự
SELECT
name, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;RANK & DENSE_RANK
SELECT
name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_dept
FROM employees;| Hàm | Salary: 50, 50, 30 |
|-----|---------------------|
| ROW_NUMBER | 1, 2, 3 |
| RANK | 1, 1, 3 |
| DENSE_RANK | 1, 1, 2 |
LAG & LEAD — So sánh với dòng trước/sau
SELECT
month, revenue,
LAG(revenue, 1) OVER (ORDER BY month) AS prev_month,
revenue - LAG(revenue, 1) OVER (ORDER BY month) AS growth
FROM monthly_sales;Running Total — Tổng lũy kế
SELECT
order_date, amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;CTE — Common Table Expression
WITH monthly_revenue AS (
SELECT
DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
),
ranked AS (
SELECT
month, revenue,
RANK() OVER (ORDER BY revenue DESC) AS rank
FROM monthly_revenue
)
SELECT * FROM ranked WHERE rank <= 3;Bài tập thực hành
Đề bài: Tìm top 3 nhân viên có doanh thu cao nhất mỗi phòng ban.
WITH ranked_employees AS (
SELECT
e.name, d.dept_name,
SUM(s.amount) AS total_sales,
DENSE_RANK() OVER (PARTITION BY d.dept_name ORDER BY SUM(s.amount) DESC) AS rank
FROM employees e
JOIN departments d ON e.dept_id = d.id
JOIN sales s ON e.id = s.employee_id
GROUP BY e.name, d.dept_name
)
SELECT * FROM ranked_employees WHERE rank <= 3;Kết luận
Window Functions và CTE là kỹ năng SQL bắt buộc cho vị trí Data Analyst. Hãy thực hành thường xuyên trên LeetCode SQL!
Nội dung Premium
Bài viết này dành cho thành viên Premium. Đăng ký gói Premium để truy cập toàn bộ nội dung chất lượng cao.
Đăng nhập để tiếp tụcBình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề

