SQL RANK() と ROW_NUMBER() 質問する

SQL RANK() と ROW_NUMBER() 質問する

これらの違いがよくわかりません。次の SQL を実行すると、2 つの同一の結果セットが返されます。違いを説明していただけますか?

SELECT ID, [Description], RANK()       OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank'      FROM SubStyle
SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle

ベストアンサー1

特定の順序値についてパーティション内に同点がある場合にのみ、違いが見られます。

RANKこの場合は決定論的でありDENSE_RANK、順序付け列とパーティション列の両方に同じ値を持つすべての行は同じ結果になりますが、ROW_NUMBER同点の行には任意に (非決定論的に) 増分結果が割り当てられます。

例: (すべての行は同じなStyleIDので同じパーティションにあり、そのパーティション内では最初の 3 行は で順序付けされたときに同点になります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  

戻り値

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

ROW_NUMBER3 つの同一行について、 が増分され、RANK値は同じままで、その後 に跳ね上がることがわかります4。はDENSE_RANK、3 つの行すべてに同じランクを割り当てますが、次の異なる値には 2 という値が割り当てられます。

おすすめ記事