sql >> Database teknologi >  >> RDS >> Sqlserver

SQL RANK() versus ROW_NUMBER()

Du vil kun se forskellen, hvis du har bindinger inden for en partition for en bestemt bestillingsværdi.

RANK og DENSE_RANK er deterministiske i dette tilfælde, vil alle rækker med samme værdi for både rækkefølge- og partitioneringskolonner ende med et ens resultat, mens ROW_NUMBER vil vilkårligt (ikke deterministisk) tildele et stigende resultat til de bundne rækker.

Eksempel: (Alle rækker har det samme StyleID så er i den samme partition, og inden for den partition er de første 3 rækker bundet, når de er sorteret 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

Returnerer

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, at for de tre identiske rækker ROW_NUMBER trin, RANK værdien forbliver den samme, så springer den til 4 . DENSE_RANK tildeler også den samme rang til alle tre rækker, men den næste distinkte værdi tildeles derefter en værdi på 2.



  1. Meget langsom opstart af Spring Boot-applikation

  2. HAProxy-forbindelser vs MySQL-forbindelser - hvad du bør vide

  3. Brug af 'case-udtrykskolonne' i where-sætning

  4. Sådan sammenlignes datetime med kun dato i SQL Server