Ответ 1
Вы можете сделать это с помощью 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
Я пытаюсь добавить новый столбец в существующую таблицу, где значение - номер строки/ранг. Мне нужен способ генерации номера строки/ранга, и мне также необходимо ограничить затронутые строки - в этом случае наличие подстроки внутри строки.
Сейчас у меня есть:
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()? FYI, это означает заменить неправильный, уже существующий столбец "rank".
Вы можете сделать это с помощью 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
Если вы обновляете несколько тысяч строк, вы можете попробовать что-то вроде этого:
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
Скопируйте и вставьте результаты запроса в редактор запросов и запустите. Это немного вяло и yukky бит работает.
Простым обходным решением было бы создать временную таблицу, которая выглядит как
CREATE TABLE #temp (id int, rank int)
Если id - это тот же самый тип, что и первичный ключ в вашей основной таблице.
Просто используйте SELECT INTO, чтобы сначала заполнить временную таблицу, а затем обновить из таблицы temp...