これらの違いがよくわかりません。次の 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_NUMBER
3 つの同一行について、 が増分され、RANK
値は同じままで、その後 に跳ね上がることがわかります4
。はDENSE_RANK
、3 つの行すべてに同じランクを割り当てますが、次の異なる値には 2 という値が割り当てられます。