
"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."
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!
SELECT
name, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;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 |
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;SELECT
order_date, amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;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ì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;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!
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ụcĐăng nhập để tham gia bình luận
Đăng nhậpĐă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.
Khám phá thêm các bài viết cùng chủ đề
Tham gia khóa học E-Learning của Trà Đá Data để được hướng dẫn chi tiết từ A-Z với Case Study thực tế.
Tìm hiểu ngay