Bạn sẽ chỉ thấy sự khác biệt nếu bạn có các ràng buộc trong một phân vùng cho một giá trị đặt hàng cụ thể.
RANK và DENSE_RANK là xác định trong trường hợp này, tất cả các hàng có cùng giá trị cho cả cột sắp xếp và phân vùng sẽ có kết quả bằng nhau, trong khi ROW_NUMBER sẽ tùy ý (không xác định) gán một kết quả tăng dần cho các hàng ràng buộc.
Ví dụ: (Tất cả các hàng có cùng một StyleID cũng vậy trong cùng một phân vùng và trong phân vùng đó, 3 hàng đầu tiên được gắn với nhau khi được sắp xếp theo thứ tự của ID )
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
Trả lại
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
Bạn có thể thấy rằng đối với ba hàng giống nhau, ROW_NUMBER gia số, RANK giá trị vẫn giữ nguyên sau đó chuyển sang 4 . DENSE_RANK cũng chỉ định cùng một thứ hạng cho cả ba hàng nhưng sau đó giá trị khác biệt tiếp theo được gán giá trị là 2.