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 ?

173voto

Darrel Miller Points 56797

Pour la première question, pourquoi ne pas simplement utiliser ?

SELECT COUNT(*) FROM myTable 

pour obtenir le compte.

Et pour la deuxième question, la clé primaire de la ligne est ce qui doit être utilisé pour identifier une ligne particulière. N'essayez pas d'utiliser le numéro de ligne pour cela.


Si vous avez retourné Row_Number() dans votre requête principale,

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

Ensuite, lorsque vous voulez remonter de 5 rangs, vous pouvez prendre le numéro de la rangée actuelle et utiliser la requête suivante pour déterminer la rangée avec currentrow -5

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5

53voto

Rashmi Pandit Points 9341

Bien que je sois d'accord avec les autres que vous pourriez utiliser count() pour obtenir le nombre total de lignes, voici comment vous pouvez utiliser la fonction row_count() :

  1. Pour obtenir le nombre total de rangées :

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  2. Pour obtenir les numéros de ligne où le nom est Matt :

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'

Vous pouvez également utiliser min(rownum) o max(rownum) pour obtenir la première ou la dernière ligne pour Matt respectivement.

Il s'agissait d'implémentations très simples de row_number() . Vous pouvez l'utiliser pour des regroupements plus complexes. Consultez ma réponse sur Groupement avancé sans utiliser de sous-requête

27voto

Muhammad Akhtar Points 32101

Si vous avez besoin de renvoyer le nombre total de lignes de la table, vous pouvez utiliser une méthode alternative à la fonction SELECT COUNT(*) déclaration.

Parce que SELECT COUNT(*) effectue un balayage complet de la table pour retourner le nombre de lignes, ce qui peut prendre beaucoup de temps pour une grande table. Vous pouvez utiliser la fonction sysindexes à la place de la table du système dans ce cas. Il existe un ROWS qui contient le nombre total de lignes pour chaque table de votre base de données. Vous pouvez utiliser l'instruction select suivante :

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2

Cela réduira considérablement le temps que prend votre requête.

13voto

Jatin Phulera Points 119

ROW_NUMBER() renvoie un numéro unique pour chaque ligne commençant par 1. Vous pouvez facilement utiliser cette fonction en écrivant simplement :

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

13voto

Omid Farvid Points 120

Vous pouvez utiliser ceci pour obtenir le premier enregistrement où la clause has

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC

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