Je veux définir le début de ROW_NUMBER()
comme 3258170
au lieu de 1
.
J'utilise la requête SQL suivante
SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'.
Cependant, la requête ci-dessus ne fonctionne pas. Quand je dis ne fonctionne pas, je veux dire son exécution mais ce n'est pas à partir de 3258170
. Quelqu'un peut-il m'aider?
La raison pour laquelle je souhaite spécifier le numéro de ligne est que j'insère des lignes d'une table à une autre. Dans le premier tableau, le numéro de ligne du dernier enregistrement est 3258169
et lorsque j'insère de nouveaux enregistrements, je veux qu'ils aient le numéro de ligne de 3258170
.
Ajoutez simplement la valeur au résultat de row_number()
:
select 3258170 - 1 + row_number() over (order by (select NULL)) as idd
La clause order by
De row_number()
spécifie la colonne utilisée pour la commande by. En spécifiant une constante à cet endroit, vous dites simplement "tout a la même valeur à des fins de commande". Cela n'a rien, rien à voir avec la première valeur choisie.
Pour éviter toute confusion, j'ai remplacé la valeur constante par NULL. Dans SQL Server, j'ai observé que cela attribue un numéro séquentiel sans vraiment trier les lignes - un avantage de performance observé, mais pas un que j'ai vu documenté, donc nous ne pouvons pas en dépendre .
Je sens que c'est plus facile
ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0)
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170)
Parfois....
ROW_NUMBER () n'est peut-être pas la meilleure solution, en particulier lorsqu'il peut y avoir des enregistrements en double dans l'ensemble de données sous-jacent (pour les requêtes JOIN, etc.). Cela peut entraîner plus de lignes renvoyées que prévu. Vous pouvez envisager de créer une SEQUENCE qui peut dans certains cas être considérée comme une solution plus propre. c'est à dire.:
CREATE SEQUENCE myRowNumberId
START WITH 1
INCREMENT BY 1
GO
SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query
GO
DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves
GO
L'inconvénient est que les séquences peuvent être difficiles à utiliser dans les requêtes complexes avec les fonctions DISTINCT, WINDOW, etc. Voir la documentation complète de la séquence ici .