RANK() (window function, MySQL 8.0+) gán thứ hạng cho mỗi hàng trong partition. Giá trị trùng → cùng rank, rank tiếp theo bị nhảy (gap).
Tạo bảng
mysql> CREATE TABLE RankDemo (Id INT); Query OK, 0 rows affected (0.53 sec) mysql> INSERT INTO RankDemo VALUES(1),(3),(3),(4),(5); Query OK, 5 rows affected
mysql> SELECT * FROM RankDemo;
+------+ | Id | +------+ | 1 | | 3 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
Áp dụng RANK()
mysql> SELECT Id, RANK() OVER (ORDER BY Id) AS Ranking
-> FROM RankDemo;
+------+---------+ | Id | Ranking | +------+---------+ | 1 | 1 | | 3 | 2 | | 3 | 2 | | 4 | 4 | | 5 | 5 | +------+---------+ 5 rows in set (0.04 sec)
Hai hàng Id=3 cùng rank 2 → rank tiếp theo là 4 (bỏ qua 3).
Liên quan: DENSE_RANK() không nhảy rank (sẽ là 1,2,2,3,4), ROW_NUMBER() luôn duy nhất (1,2,3,4,5).