Как добавить столбец с номером строки в SQL Server 2012

Я пытаюсь добавить новый столбец в существующую таблицу, где значением является номер строки / ранг. Мне нужен способ генерирования номера строки / значения ранга, а также мне нужно ограничить затронутые строки - в этом случае наличие подстроки в строке.

Прямо сейчас у меня есть:

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()? К вашему сведению, это должно заменить неправильный, уже существующий столбец "ранг".

3 ответа

Решение

Вы можете сделать это с помощью 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 с демоверсией.

Если вы обновляете только несколько тысяч строк, вы можете попробовать что-то вроде этого:

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

Скопируйте и вставьте результаты запроса в редактор запросов и запустите. Это немного вяло и немного неуклюже, это работает.

Простой обходной путь - создать временную таблицу, которая выглядит как

CREATE TABLE #temp (id int, rank int)

Где id того же типа, что и первичный ключ в основной таблице.

Просто используйте SELECT INTO, чтобы сначала заполнить временную таблицу, а затем обновить ее из временной таблицы…

Другие вопросы по тегам