20

我正在尝试向现有表添加一个新列,其中值是行号/排名。我需要一种方法来生成行号/排名值,并且我还需要限制受影响的行——在这种情况下,字符串中存在子字符串。

现在我有:

UPDATE table
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table
WHERE CHARINDEX('2009',col2) > 0

我得到这个错误:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

(同样的错误RANK()

有没有办法使用 ROW_NUMBER() 函数创建/更新列?仅供参考,这是为了替换不正确的、已经存在的“等级”列。

4

3 回答 3

32

您可以使用 CTE 执行此操作,例如:

with cte as
(
  select *
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc)
  from MyTable
  where charindex('2009',col2) > 0
)
update cte
set row_id = new_row_id

SQL Fiddle 与演示

于 2013-08-25T22:00:52.683 回答
1

如果你只更新几千行,你可以尝试这样的事情:

select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar)
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause
) tbl

将查询结果复制并粘贴到查询编辑器中并运行。它有点迟钝,而且很有效。

于 2014-04-29T12:27:16.153 回答
-1

简单的解决方法是创建一个看起来像的临时表

创建表#temp(id int,rank int)

其中 id 与主表中的主键类型相同。

只需使用 SELECT INTO 先填充临时表,然后从临时表更新...</p>

于 2013-08-26T09:20:05.740 回答