Sử dụng hàm cửa sổ ROW_NUMBER() để đánh số thứ tự trong MySQL
Từ MySQL 8.0, hàm cửa sổ ROW_NUMBER() cho phép tạo chỉ số hàng (rank) trong kết quả truy vấn, hỗ trợ phân vùng (PARTITION BY) để reset số thứ tự cho từng nhóm.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Name VARCHAR(40)
);
mysql> INSERT INTO DemoTable VALUES
('Chris'), ('Chris'), ('Chris'),
('Robert'), ('Robert'),
('Adam'), ('Adam'), ('Adam'), ('Adam');
2. Xem dữ liệu gốc
mysql> SELECT * FROM DemoTable;
Kết quả (9 hàng):
+--------+ | Name | +--------+ | Chris | | Chris | | Chris | | Robert | | Robert | | Adam | | Adam | | Adam | | Adam | +--------+
3. Truy vấn: Tạo rank cho mỗi tên
mysql> SELECT Name, ROW_NUMBER() OVER (PARTITION BY Name) AS `Rank`
FROM DemoTable;
4. Kết quả
+--------+------+ | Name | Rank | +--------+------+ | Adam | 1 | | Adam | 2 | | Adam | 3 | | Adam | 4 | | Chris | 1 | | Chris | 2 | | Chris | 3 | | Robert | 1 | | Robert | 2 | +--------+------+
Giải thích:
PARTITION BY Name: Chia dữ liệu thành các nhóm theo tên, mỗi nhóm đánh số từ 1ROW_NUMBER(): Gán số thứ tự liên tiếp trong mỗi phân vùng- Kết quả được sắp xếp theo Name (mặc định của partition)
Lưu ý: Cần MySQL 8.0+. Với phiên bản cũ, dùng biến user-defined: SET @row=0; SELECT Name, @row:=@row+1 AS Rank FROM DemoTable (không hỗ trợ partition tự động).