web-dev-qa-db-fra.com

Spécifiez manuellement la valeur de départ pour Row_Number ()

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.

29
Huzaifa

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 .

56
Gordon Linoff

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)
8
Tom McDonough

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 .

1
Milan