213 votes

Comment utiliser ROW_NUMBER() ?

Je veux utiliser le ROW_NUMBER() pour obtenir...

  1. Pour obtenir le max(ROW_NUMBER()) --> Ou je suppose que ce serait aussi le compte de toutes les lignes.

J'ai essayé de le faire :

SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users

mais ça ne semble pas fonctionner...

  1. Pour obtenir ROW_NUMBER() en utilisant un élément d'information donné, par exemple, si j'ai un nom et que je veux savoir de quelle rangée provient ce nom.

Je suppose que ce serait quelque chose de similaire à ce que j'ai essayé pour le numéro 1.

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

mais cela n'a pas fonctionné non plus...

Des idées ?

2voto

Richard S Points 21

Si vous voulez absolument utiliser ROW_NUMBER pour cela (au lieu de count(*)), vous pouvez toujours utiliser :

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC

2voto

Gaurav Chutke Points 27

Il faut créer une table virtuelle en utilisant WITH table AS qui est mentionné dans la requête donnée.

En utilisant cette table virtuelle, vous pouvez effectuer des opérations CRUD avec les éléments suivants row_number .

QUERY :

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

Vous pouvez utiliser INSERT , UPDATE o DELETE dans la dernière phrase par en dépit de SELECT .

1voto

Eralper Points 364

Fonction SQL Row_Number() consiste à trier et à attribuer un numéro d'ordre aux lignes de données dans un ensemble d'enregistrements liés. Il est donc utilisé pour numéroter les lignes, par exemple pour identifier les 10 premières lignes qui ont le montant de commande le plus élevé ou identifier la commande de chaque client qui a le montant le plus élevé, etc.

Si vous voulez trier l'ensemble de données et numéroter chaque ligne en les séparant en catégories, nous utilisons Row_Number() avec la clause Partition By. Par exemple, trier les commandes de chaque client en son sein lorsque le jeu de données contient toutes les commandes, etc.

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

Mais si je comprends bien, vous voulez calculer le nombre de lignes groupées par une colonne. Pour visualiser l'exigence, si vous voulez voir le nombre de toutes les commandes du client lié comme une colonne séparée en plus de l'information de commande, vous pouvez employer Fonction d'agrégation COUNT() avec la clause Partition By

Par exemple,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader

0voto

Clark Vera Points 68

Cette requête :

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

retournera toutes les lignes où l'élément UserName es 'Joe' À MOINS que vous n'ayez UserName='Joe'

Ils seront classés dans l'ordre suivant UserID et le row_number commencera par 1 et s'incrémentera en fonction du nombre de lignes qu'il contient. UserName='Joe'

Si cela ne fonctionne pas pour vous, alors votre WHERE a un problème OU il n'y a pas de UserID dans le tableau. Vérifiez l'orthographe des deux champs UserID y UserName .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X