Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL RANK () so với ROW_NUMBER ()

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ể.

RANKDENSE_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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giới thiệu về Storage Spaces Direct cho SQL Server

  2. Sử dụng TYPEPROPERTY () để trả về thông tin về kiểu dữ liệu trong SQL Server

  3. Cách xác định lại các cột được trả về bởi một thủ tục được lưu trữ trong SQL Server

  4. Chèn các ký tự vào giữa chuỗi trong SQL Server (T-SQL)

  5. Có LastIndexOf trong SQL Server không?