如何为相同的值获取相同的rownumber()

时间:2019-04-29 08:39:11

标签: sql sql-server tsql window-functions

如果列周和描述中的值重复,则需要获得相同的“行号”。对于下表:

╔════════╦═══════╦
║  Week  ║ Desc  ║
╠════════╬═══════╬
║      1 ║  FF   ║
║      1 ║  ss   ║
║      1 ║  ss   ║
║      2 ║  FF   ║
║      2 ║  ss   ║
║      4 ║  FF   ║
║      4 ║  FF   ║
║      4 ║  ss   ║
║      4 ║  ss   ║
╚════════╩═══════╝

预期结果是:

╔════════╦═══════╦════════╗
║  Week  ║ Desc  ║ RowNum ║
╠════════╬═══════╬════════╬
║      1 ║  FF   ║    1   ║
║      1 ║  ss   ║    2   ║
║      1 ║  ss   ║    2   ║
║      2 ║  FF   ║    1   ║
║      2 ║  ss   ║    2   ║
║      4 ║  FF   ║    1   ║
║      4 ║  FF   ║    1   ║
║      4 ║  ss   ║    2   ║
║      4 ║  ss   ║    2   ║
╚════════╩═══════╩════════╝

1 个答案:

答案 0 :(得分:7)

您要用DENSE_RANK而不是ROW_NUMBER

SELECT Week
     , [Desc]
     , DENSE_RANK() OVER (PARTITION BY Week ORDER BY [Desc]) AS [Rank #]
FROM t

DENSE_RANKRANK将相同的值分配给按列顺序打领带的行。另外,DENSE_RANK会分配“密集”等级编号,而不是“间隙”编号。