sql >> Database >  >> RDS >> Sqlserver

SQL RANK() versus ROW_NUMBER()

Je zult het verschil alleen zien als je banden binnen een partitie hebt voor een bepaalde bestelwaarde.

RANK en DENSE_RANK zijn in dit geval deterministisch, alle rijen met dezelfde waarde voor zowel de volgorde- als de partitioneringskolom zullen een gelijk resultaat opleveren, terwijl ROW_NUMBER zal willekeurig (niet deterministisch) een oplopend resultaat toewijzen aan de gebonden rijen.

Voorbeeld: (Alle rijen hebben dezelfde StyleID dus zijn in dezelfde partitie en binnen die partitie zijn de eerste 3 rijen gebonden wanneer besteld door 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  

Retourneren

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

Je kunt zien dat voor de drie identieke rijen de ROW_NUMBER stappen, de RANK waarde blijft hetzelfde en springt naar 4 . DENSE_RANK kent ook dezelfde rangorde toe aan alle drie de rijen, maar dan krijgt de volgende afzonderlijke waarde een waarde van 2.



  1. Waarom werkt mijn t-sql left join niet?

  2. SQL Server 2005 Hoe creëer je een unieke beperking?

  3. GROUP_CONCAT in SQLite

  4. Vergelijkbare UTF-8-tekenreeksen voor veld voor automatisch aanvullen