在SQL Server中重新编号动态列而不进行更新

时间:2014-02-28 16:30:12

标签: sql sql-server tsql sql-server-2012

我有这个数据

5 | Batman
5 | Superman
5 | Wonderwomen
6 | Green Lantern
6 | Green Arrow
7 | Cyborg

当我选择查询时,我想重新编号

1 | Batman
1 | Superman
1 | Wonderwomen
2 | Green Lantern
2 | Green Arrow
3 | Cyborg

思想?

修改

感谢vittore,所以我提出了这个解决方案。我不确定我的查询是否合适。 我做了两次 ROW_NUMBER()。如果我的序列ID正在跳转,则此查询将完全重新编号。

WITH cte AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER BY id asc) AS CteId
FROM MyTable
)
 SELECT
 ROW_NUMBER() OVER(PARTITION BY CteId ORDER BY CteId asc) AS RenumberColumn
 FROM cte

2 个答案:

答案 0 :(得分:3)

RANK函数就是你要找的东西

select RANK() OVER (ORDER BY id), name
from t

当您阅读它时,请检查row_number()dense_rank()

更新:如果您只是单独使用排名,它将不会为您提供所需的值(1 1 1 2 2 3),而是排名值(1 1 1 4 4 6)

所以为了获得(1 2 3)组,排名和加入:

  select a.r, t.name from t  
      inner join (select id, rank() over (order by id asc) r 
                  from t group by id) a 
         on t.id = a.id

答案 1 :(得分:0)

如果它总是-4,那么:

Select (number-4), name
from table

但我怀疑它就这么简单。