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.