J'essaie d'ajouter une nouvelle colonne à une table existante, où la valeur est le numéro/rang de la ligne. J'ai besoin d'un moyen de générer le numéro de rang/valeur de rang, et j'ai également besoin de limiter les rangées affectées - dans ce cas, la présence d'une sous-chaîne dans une chaîne.
En ce moment j'ai:
UPDATE table
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table
WHERE CHARINDEX('2009',col2) > 0
Et je reçois cette erreur:
Windowed functions can only appear in the SELECT or ORDER BY clauses.
(Même erreur pour RANK()
)
Est-il possible de créer/mettre à jour une colonne avec la fonction ROW_NUMBER ()? Pour votre information, ceci est destiné à remplacer une colonne "rang" incorrecte, déjà existante.
Vous pouvez le faire avec un CTE, quelque chose comme:
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
Si vous ne mettez à jour que quelques milliers de lignes, vous pouvez essayer quelque chose comme ceci:
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
Copiez et collez les résultats de la requête dans l'éditeur de requête et exécutez-les. C'est un peu lent et yukky ça marche.