×

Tính thứ hạng với DENSE_RANK trong MySQL

Trong khi xử lý các truy vấn SQL phức tạp, một phần không thể thiếu của phân tích dữ liệu thường là xếp hạng các bản ghi theo một số tiêu chí cụ thể. MySQL cung cấp nhiều phương thức để thực hiện việc này, và một trong những phương thức quan trọng nhất là hàm DENSE_RANK. Bài viết này sẽ hướng dẫn bạn cách sử dụng hàm DENSE_RANK trong MySQL một cách chi tiết.

Hiểu về DENSE_RANK

DENSE_RANK là một hàm cửa sổ (window function) trong MySQL, được sử dụng để xếp hạng các hàng với các giá trị tương đương một cách liên tục mà không bị gián đoạn. Điều này có ý nghĩa rất đặc biệt khi bạn muốn xếp hạng dữ liệu với các giá trị giống nhau và muốn tránh các khoảng trống trong xếp hạng.

Cú pháp của DENSE_RANK

Cú pháp cơ bản của hàm DENSE_RANK trong MySQL như sau:

DENSE_RANK() OVER (
    [PARTITION BY partition_expression]
    ORDER BY sort_expression [ASC | DESC]
)
  • PARTITION BY: Tùy chọn, cho phép chia dữ liệu thành các nhóm trước khi áp dụng hàm xếp hạng.
  • ORDER BY: Bắt buộc, chỉ định tiêu chí sắp xếp mà hàm DENSE_RANK sẽ dựa vào để xếp hạng các bản ghi.

Ví dụ Minh Họa

Để minh họa cách hàm DENSE_RANK hoạt động, giả sử chúng ta có một bảng employees với các cột employee_id, department_id, và salary.

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    department_id INT,
    salary DECIMAL(10, 2)
);

Chúng ta sẽ thêm một số bản ghi vào bảng:

INSERT INTO employees (employee_id, department_id, salary) VALUES
(1, 1, 5000.00),
(2, 2, 6000.00),
(3, 1, 5000.00),
(4, 2, 7000.00),
(5, 1, 7000.00);

Bây giờ, giả sử chúng ta muốn xếp hạng nhân viên trong từng phòng ban theo mức lương của họ. Dưới đây là cách sử dụng hàm DENSE_RANK để thực hiện điều này:

SELECT 
    employee_id,
    department_id,
    salary,
    DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM 
    employees;

Kết quả trả về sẽ là:

+-------------+---------------+---------+------+
| employee_id | department_id | salary  | rank |
+-------------+---------------+---------+------+
|           5 |             1 | 7000.00 |    1 |
|           1 |             1 | 5000.00 |    2 |
|           3 |             1 | 5000.00 |    2 |
|           4 |             2 | 7000.00 |    1 |
|           2 |             2 | 6000.00 |    2 |
+-------------+---------------+---------+------+

So sánh với RANK

Một điểm khác biệt giữa DENSE_RANK và hàm RANK là DENSE_RANK không bỏ qua các số thứ tự khi trùng lặp giá trị, trong khi hàm RANK bỏ qua các số thứ tự để đánh số tiếp theo. Ví dụ sử dụng cùng dữ liệu và cú pháp để tạo hàm RANK:

SELECT 
    employee_id,
    department_id,
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM 
    employees;

Kết quả sẽ là:

+-------------+---------------+---------+------+
| employee_id | department_id | salary  | rank |
+-------------+---------------+---------+------+
|           5 |             1 | 7000.00 |    1 |
|           1 |             1 | 5000.00 |    2 |
|           3 |             1 | 5000.00 |    2 |
|           4 |             2 | 7000.00 |    1 |
|           2 |             2 | 6000.00 |    2 |
+-------------+---------------+---------+------+

Chú ý rằng khi có giá trị bị trùng, hàm RANK sẽ nhảy các số thứ tự (vd. từ 1 đến 3), trong khi DENSE_RANK không bỏ qua bất kỳ số thứ tự nào.

Kết Luận

Hàm DENSE_RANK trong MySQL là một công cụ mạnh mẽ và linh hoạt giúp bạn xếp hạng các bản ghi mà không tạo ra khoảng trống trong các vị trí xếp hạng. Việc hiểu và sử dụng đúng cách hàm DENSE_RANK giúp bạn tối ưu hóa truy vấn và đạt được năng suất cao hơn trong việc phân tích dữ liệu.

Hy vọng bài viết này cung cấp cho bạn một cái nhìn tổng quan và chi tiết về cách sử dụng hàm DENSE_RANK trong MySQL. Chúc bạn thành công trong việc áp dụng kiến thức này vào các bài toán thực tế!

Comments