web-dev-qa-db-fra.com

Comment utiliser ROW_NUMBER ()?

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

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

J'ai essayé de faire:

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

mais ça n'a pas semblé marcher ...

  1. Pour obtenir ROW_NUMBER() en utilisant une information donnée, c'est-à-dire. si j'ai un nom et que je veux savoir de quelle rangée vient le nom.

Je suppose que ce serait quelque chose de similaire à ce que j'ai essayé pour # 1

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

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

Des idées?

157
Matt

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 renvoyé Row_Number () dans votre requête principale,

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

Ensuite, lorsque vous souhaitez revenir 5 lignes en arrière, vous pouvez utiliser le numéro de ligne actuel et utiliser la requête suivante pour déterminer la ligne avec currentrow -5.

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

Bien que je convienne avec d’autres que vous pourriez utiliser count() pour obtenir le nombre total de lignes, voici comment vous pouvez utiliser la row_count():

  1. Pour obtenir le nombre total de lignes:

    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 dont 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) ou max(rownum) pour obtenir la première ou la dernière ligne de Matt, respectivement.

C'étaient des implémentations très simples de row_number(). Vous pouvez l'utiliser pour un regroupement plus complexe. Découvrez ma réponse sur Groupement avancé sans utiliser de sous-requête

41
Rashmi Pandit

Si vous devez renvoyer le nombre total de lignes de la table, vous pouvez utiliser une méthode alternative à l'instruction SELECT COUNT(*).

Étant donné que SELECT COUNT(*) effectue une analyse complète de la table afin de renvoyer le nombre de lignes, le temps nécessaire à une grande table peut être très long. Vous pouvez utiliser la table système sysindexes à la place dans ce cas. Il existe une colonne ROWS contenant 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 nécessaire à votre requête.

24
Muhammad Akhtar

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

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

Vous pouvez trouver la différence entre Row_number(), Rank() et Dense_Rank()ici .

7
Jatin Phulera

Vous pouvez utiliser ceci pour get first record où a la clause

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC
4
Omid Farvid
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'
4
Alex Martelli

Peut ne pas être lié à la question ici. Mais j’ai trouvé que cela pourrait être utile lors de l’utilisation de ROW_NUMBER -

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table
3
Jyo
select 
  Ml.Hid,
  ml.blockid,
  row_number() over (partition by ml.blockid order by Ml.Hid desc) as rownumber,
  H.HNAME 
from MIT_LeadBechmarkHamletwise ML
join [MT.HAMLE] h on ML.Hid=h.HID
3
Hari Lakkakula

Besoin de créer une table virtuelle en utilisant WITH table AS, qui est mentionné dans une requête donnée.

En utilisant cette table virtuelle, vous pouvez exécuter l'opération CRUD w.r.t row_number.

REQUETE:

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

Vous pouvez utiliser INSERT, UPDATE ou DELETE dans la dernière phrase de malgré SELECT.

2
Gaurav Chutke

Vous pouvez utiliser Row_Number pour limiter le résultat de la requête.

Exemple:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- Avec la requête ci-dessus, j'obtiendrai la PAGE 1 des résultats de TABLENAME.

2
Johnson Pham

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
2
Richard S

fonction SQL Row_Number () permet de trier et d'attribuer un numéro de commande aux lignes de données du jeu d'enregistrements associé. Ainsi, il est 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 pour identifier la commande de chaque client qui correspond au montant le plus élevé, etc.

Si vous souhaitez trier l'ensemble de données et numéroter chaque ligne en les séparant en catégories, utilisez Row_Number () avec la clause Partition By. Par exemple, trier les commandes de chaque client au sein de lui-même où l'ensemble 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 j'ai bien compris, vous voulez calculer le nombre de lignes groupées par colonne. Pour visualiser l'exigence, si vous souhaitez afficher le nombre de toutes les commandes du client associé sous forme de colonne distincte, en plus des informations sur la commande, vous pouvez utiliser la fonction d'agrégation COUNT () avec la clause Partition By

Par exemple,

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

Cette requête:

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

retournera toutes les lignes où la UserName est 'Joe' SAUF si vous n'avez pas UserName='Joe'

Ils seront listés dans l'ordre de UserID et le champ row_number commencera par 1 et sera incrémenté, peu importe le nombre de lignes contenant UserName='Joe'.

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

0
Clark Vera