Cả ba là window function đánh số theo ORDER BY trong mỗi partition. Khác nhau khi gặp giá trị bằng nhau (ties):
- ROW_NUMBER(): đánh số liên tục duy nhất 1, 2, 3, 4... kể cả khi bằng nhau (thứ tự giữa các dòng bằng nhau là tùy ý).
- RANK(): dòng bằng nhau cùng hạng, nhưng bỏ số kế tiếp — ví dụ 1, 1, 3 (nhảy qua 2).
- DENSE_RANK(): dòng bằng nhau cùng hạng nhưng không bỏ số — 1, 1, 2.
sql
SELECT name, score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rn,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS drnk
FROM players;Dùng ROW_NUMBER để lấy "một dòng mỗi nhóm" (top-N) — bọc trong subquery rồi lọc WHERE rn = 1; dùng RANK/DENSE_RANK khi cần xếp hạng có xử lý đồng hạng.