×

Tính thứ hạng dày đặc với hàm DENSE_RANK() trong MySQL

Tầm quan trọng của việc sắp xếp và xếp hạng dữ liệu trong cơ sở dữ liệu không thể phủ nhận, đặc biệt là khi xử lý các tập dữ liệu lớn và phức tạp. Một trong những công cụ mạnh mẽ giúp thực hiện điều này trong MySQL là hàm DENSE_RANK(). Hàm này đóng vai trò quan trọng trong việc tính toán thứ hạng đặc biệt và thường được sử dụng trong nhiều bài toán phân tích dữ liệu. Bài viết này sẽ đi sâu vào khái niệm, cách sử dụng và ứng dụng thực tiễn của hàm DENSE_RANK().

Khái niệm của hàm trong MySQL

Hàm DENSE_RANK() là một hàm xếp hạng trong SQL giúp gán thứ tự cho các hàng trong một tập kết quả. Hàm này đặc biệt ở chỗ nó gán thứ hạng liên tiếp cho các giá trị khác nhau mà không bỏ qua bất kỳ số thứ hạng nào trong quá trình. Nghĩa là, nếu có hai hàng có giá trị giống nhau và đứng ở vị trí thứ hai, hàm sẽ gán cả hai thứ hạng 2 và tiếp tục với giá trị xếp hạng liền kề (thứ hạng 3) cho giá trị tiếp theo.

Cấu trúc của hàm

Hàm DENSE_RANK() có cấu trúc đơn giản, bao gồm các thành phần như sau:

DENSE_RANK() OVER (
    PARTITION BY column_name
    ORDER BY column_name [ASC|DESC]
)
  • PARTITION BY chia kết quả thành các phần tập con trước khi tính toán thứ hạng.
  • ORDER BY xác định thứ tự sắp xếp theo cột nào.

Ví dụ thực tế

Giả sử chúng ta có một bảng “nhân viên” (employees) với các cột: employee_id, department_idsalary. Mục tiêu của chúng ta là xếp hạng nhân viên trong mỗi bộ phận theo mức lương từ cao đến thấp.

Cơ sở dữ liệu

CREATE TABLE employees (
    employee_id INT,
    department_id INT,
    salary DECIMAL(10, 2)
);
 
INSERT INTO employees (employee_id, department_id, salary)
VALUES
(1, 1, 5000.00),
(2, 1, 7000.00),
(3, 1, 7000.00),
(4, 2, 4500.00),
(5, 2, 4500.00),
(6, 2, 8000.00);

Truy vấn sử dụng hàm

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ề

+-------------+--------------+--------+------+
| employee_id | department_id| salary | rank |
+-------------+--------------+--------+------+
|           2 |            1 | 7000.00|    1 |
|           3 |            1 | 7000.00|    1 |
|           1 |            1 | 5000.00|    2 |
|           6 |            2 | 8000.00|    1 |
|           4 |            2 | 4500.00|    2 |
|           5 |            2 | 4500.00|    2 |
+-------------+--------------+--------+------+

Trong ví dụ trên, bạn có thể thấy rằng hàm DENSE_RANK() đã gán thứ hạng liên tiếp cho các giá trị lương trong từng bộ phận mà không bỏ qua bất kỳ số thứ tự nào.

Các lợi ích của việc sử dụng hàm

  • Dễ dàng kiểm tra và so sánh: Hàm giúp dễ dàng kiểm tra và so sánh thứ hạng của các giá trị trong tập dữ liệu.
  • Hiệu quả và chính xác: Gán thứ hạng một cách hiệu quả và chính xác mà không bỏ qua bất kỳ số thứ tự nào.
  • Ứng dụng rộng rãi: Có thể sử dụng trong nhiều bài toán thực tiễn như xếp hạng học sinh, sản phẩm, nhân viên,...

Kết luận

Hàm DENSE_RANK() là một công cụ mạnh mẽ và linh hoạt giúp bạn tính toán thứ hạng trong tập dữ liệu một cách chi tiết và liên tục. Với sự hiểu biết và kỹ năng áp dụng đúng cách, bạn có thể tận dụng hàm này để mang lại hiệu quả cao hơn trong quá trình xử lý và phân tích dữ liệu.

Comments