Je veux utiliser la ROW_NUMBER()
pour obtenir ...
max(ROW_NUMBER())
-> Ou je suppose que ce serait aussi le nombre de toutes les lignesJ'ai essayé de faire:
SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
mais ça n'a pas semblé marcher ...
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?
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
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()
:
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
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
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.
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 .
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
SELECT num, UserName FROM
(SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
From Users) AS numbered
WHERE UserName='Joe'
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
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
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
.
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
.
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
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
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
.