sql >> Databasteknik >  >> RDS >> Sqlserver

SQL RANK() kontra ROW_NUMBER()

Du kommer bara att se skillnaden om du har kopplingar inom en partition för ett visst beställningsvärde.

RANK och DENSE_RANK är deterministiska i det här fallet kommer alla rader med samma värde för både beställnings- och partitioneringskolumnen att få ett lika stort resultat, medan ROW_NUMBER kommer godtyckligt (icke deterministiskt) att tilldela ett ökande resultat till de bundna raderna.

Exempel: (Alla rader har samma StyleID så är i samma partition och inom den partitionen är de första 3 raderna kopplade när de sorteras efter 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  

Retur

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

Du kan se att för de tre identiska raderna ROW_NUMBER stegar, RANK värdet förblir detsamma och sedan hoppar det till 4 . DENSE_RANK tilldelar också samma rang till alla tre raderna men sedan tilldelas nästa distinkta värde värdet 2.



  1. Snabbt och smutsigt för loopar i det omedelbara fönstret

  2. Hur räknar man antalet förekomster av en viss delsträng i en SQL-varchar?

  3. Kod för att validera SQL-skript

  4. Utforska lagringsmotoralternativ för MariaDB