Top N trong mỗi nhóm
Thuộc phần Vượt ra ngoài kiến thức cơ bản trong hành trình SQL của Coddy. Bài học 23 trên 27.
“Nhân viên có mức lương cao nhất ở mỗi phòng ban” là ví dụ kinh điển trong sách giáo khoa. Cách làm luôn là ROW_NUMBER() với PARTITION BY, sau đó lọc lấy hàng 1.
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1Muốn lấy top 3 thay vì top 1? Đổi WHERE rn = 1 thành WHERE rn <= 3. Muốn cho phép đồng hạng ở vị trí đầu? Thay ROW_NUMBER() bằng RANK().
Thử thách
DễCác bảng và cột hiện có:
employees:id,name,department,salary
Trả về nhân viên có lương cao nhất trong mỗi department. Xuất name, department và salary, sắp xếp theo department. Nếu có hai nhân viên cùng đứng đầu trong một phòng ban, chỉ trả về một người: người có id nhỏ hơn.
Tự làm thử
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Vượt ra ngoài kiến thức cơ bản
6Công thức phân tích dữ liệu
Top N trong mỗi nhómTỷ lệ trên tổngTổng lũy kếGiữ lại một hàng cho mỗi khóaÔn tập: khách hàng hàng đầuTự luyện tập: Playground SQL