Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tạo chỉ số hàng (rank) trong SELECT MySQL với ROW_NUMBER()

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ừ 1
  • ROW_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).