Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL RANK() a ROW_NUMBER()

Różnicę zobaczysz tylko wtedy, gdy masz powiązania w partycji dla określonej wartości zamówienia.

RANK i DENSE_RANK są w tym przypadku deterministyczne, wszystkie wiersze z tą samą wartością dla kolumn porządkowania i partycjonowania kończą się równym wynikiem, podczas gdy ROW_NUMBER arbitralnie (nie deterministycznie) przypisze wynik inkrementacji do powiązanych wierszy.

Przykład: (Wszystkie wiersze mają ten sam StyleID więc znajdują się w tej samej partycji i w obrębie tej partycji pierwsze 3 wiersze są powiązane, gdy są uporządkowane według 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  

Zwroty

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

Widać, że dla trzech identycznych wierszy ROW_NUMBER przyrosty, RANK wartość pozostaje taka sama, a następnie przeskakuje do 4 . DENSE_RANK również przypisuje tę samą rangę do wszystkich trzech wierszy, ale następna odrębna wartość otrzymuje wartość 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. Zwracanie wielu tabel z procedury składowanej

  2. Funkcja partycji COUNT() OVER możliwa przy użyciu DISTINCT

  3. Jak używać sortowania UTF-8 w bazie danych SQL Server?

  4. Migawki bazy danych programu SQL Server -1

  5. Konwertuj „czas” na „smalldatetime” w SQL Server (przykłady T-SQL)