×

Đánh số hàng với hàm ROW_NUMBER() trong MySQL

Khi làm việc với các cơ sở dữ liệu, có nhiều lúc bạn sẽ cần đánh số hàng một cách tuần tự để quản lý dữ liệu dễ dàng hơn. Một trong những cách để thực hiện việc này trong MySQL là sử dụng hàm ROW_NUMBER().

Giới Thiệu về Hàm ROW_NUMBER()

Hàm ROW_NUMBER() là một hàm cửa sổ (window function) cho phép bạn gán một số thứ tự duy nhất cho mỗi hàng trong tập kết quả của truy vấn, dựa trên cách sắp xếp được chỉ định. Hàm này rất hữu ích khi bạn muốn lập chỉ mục hoặc đánh số một cách tuần tự các hàng trong kết quả truy vấn.

Cấu Trúc Cơ Bản

Cấu trúc cơ bản của hàm ROW_NUMBER() như sau:

ROW_NUMBER() OVER (
    [PARTITION BY expression1, expression2, ...]
    ORDER BY expression3 [ASC | DESC], expression4 [ASC | DESC], ...
)
  • PARTITION BY: Là tuỳ chọn (optional). Cú pháp này chia tập kết quả thành các nhóm phân vùng và gán số thứ tự bắt đầu từ 1 cho mỗi phân vùng. Nếu không sử dụng PARTITION BY, toàn bộ tập kết quả sẽ được coi như một phân vùng duy nhất.
  • ORDER BY: Bắt buộc. Xác định thứ tự sắp xếp các hàng để đánh số.

Ví Dụ Cụ Thể

1. Sử Dụng ROW_NUMBER() mà Không Phân Vùng

Giả sử bạn có một bảng employees như sau:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(100),
    salary INT
);

INSERT INTO employees (id, name, department, salary) VALUES
(1, 'Alice', 'HR', 60000),
(2, 'Bob', 'IT', 90000),
(3, 'Charlie', 'Finance', 75000),
(4, 'David', 'HR', 65000),
(5, 'Eve', 'IT', 80000);

Bạn muốn đánh số thứ tự cho tất cả các nhân viên dựa trên mức lương của họ:

SELECT 
    ROW_NUMBER() OVER (ORDER BY salary DESC) as row_num,
    id, name, department, salary
FROM 
    employees;

Kết quả sẽ là:

| row_num | id | name    | department | salary |
|---------|----|---------|------------|--------|
| 1       | 2  | Bob     | IT         | 90000  |
| 2       | 5  | Eve     | IT         | 80000  |
| 3       | 3  | Charlie | Finance    | 75000  |
| 4       | 4  | David   | HR         | 65000  |
| 5       | 1  | Alice   | HR         | 60000  |

2. Sử Dụng ROW_NUMBER() với Phân Vùng

Bây giờ, bạn muốn đánh số thứ tự cho các nhân viên trong từng phòng ban riêng biệt:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as row_num,
    id, name, department, salary
FROM 
    employees;

Kết quả sẽ là:

| row_num | id | name    | department | salary |
|---------|----|---------|------------|--------|
| 1       | 4  | David   | HR         | 65000  |
| 2       | 1  | Alice   | HR         | 60000  |
| 1       | 2  | Bob     | IT         | 90000  |
| 2       | 5  | Eve     | IT         | 80000  |
| 1       | 3  | Charlie | Finance    | 75000  |

Ứng Dụng Thực Tế

  • Phân loại dữ liệu: Đánh số thứ tự giúp dễ dàng phân loại và lọc dữ liệu.
  • Lập thứ tự ưu tiên: Xác định ưu tiên công việc, nhiệm vụ, hoặc sản phẩm.
  • Phân trang: Chia dữ liệu thành các trang nhỏ hơn để hiển thị trên giao diện người dùng.

Lưu Ý

Hàm ROW_NUMBER() là một phần của nhóm hàm cửa sổ, chỉ khả dụng từ phiên bản MySQL 8.0 trở đi. Nếu bạn sử dụng các phiên bản cũ hơn, bạn có thể cần các giải pháp thay thế phức tạp hơn.

Tóm lại, hàm ROW_NUMBER() trong MySQL là một công cụ mạnh mẽ và linh hoạt giúp bạn dễ dàng sắp xếp và đánh số liệu trình, hỗ trợ tốt cho các nhu cầu quản lý và hiển thị dữ liệu.

Comments