Menu
CoddyTech

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 = 1

Muố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().

challenge icon

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
quiz iconTự kiểm tra

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

Tự luyện tập: Playground SQL