如何重新计算列以删除空白?

时间:2015-03-09 09:44:41

标签: sql sql-server-2008

我有一张包含各种排名的表格:

id  | rank_group    | position
1   |1              | 2
2   |1              | 3
3   |2              | 1
6   |2              | 2
8   |1              | 8
9   |1              | 6
10  |1              | 7

我想知道是否有可能通过一个查询重新计算每个等级组的所有位置,以使其跟随其他人?

这意味着我像桌子一样扭转了:

id  | rank_group    | position
1   |1              | 1
2   |1              | 2
3   |2              | 1
6   |2              | 2
8   |1              | 5
9   |1              | 3
10  |1              | 4

2 个答案:

答案 0 :(得分:2)

也许在CTE和ROW_NUMBER

的帮助下
WITH CTE AS
(
    SELECT [id], [rank_group], [position],
           rowNum = ROW_NUMBER() OVER (PARTITION BY rank_group ORDER BY position ASC)
   FROM dbo.Table1
)
UPDATE CTE SET position = rowNum;

DEMO

答案 1 :(得分:1)

对同一rank_group内较低位置的项目进行直接更新可以解决问题:

update test
set position = 1 + (
  select count(*) from test tt
  where t.rank_group=tt.rank_group AND tt.position < t.position
)
from test t

Demo.