Dans SQL Server, le ROW_NUMBER()
La fonction vous permet de numéroter la sortie d'un jeu de résultats. Il renvoie le numéro séquentiel de chaque ligne, en commençant à 1.
Si vous spécifiez des partitions pour le jeu de résultats, chaque partition entraîne le redémarrage de la numérotation (c'est-à-dire que la numérotation commencera à 1 pour la première ligne de chaque partition).
Syntaxe
La syntaxe ressemble à ceci :
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
PARTITION BY value_expression
est facultatif. Il divise le jeu de résultats produit par le FROM
clause en partitions auxquelles la fonction est appliquée. expression_valeur spécifie la colonne par laquelle le jeu de résultats est partitionné. Si le PARTITION BY
clause n'est pas spécifiée, toutes les lignes du jeu de résultats de la requête sont traitées comme un seul groupe.
ROW_NUMBER
unique dans une partition spécifiée.
Notez que le OVER
la clause accepte normalement une
Exemple 1 - Utilisation de base
Voici un exemple de base montrant comment cette fonction fonctionne :
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM Albums ;
Résultat :
+-------+-----------+-------------------------- +| Ligne | ID d'album | Nom de l'album ||-------+-----------+--------------------------| | 1 | 1 | Powerslave || 2 | 2 | Alimentation || 3 | 3 | Chanter sur la voie || 4 | 4 | Ziltoid l'Omniscient || 5 | 5 | Victimes de Cool || 6 | 6 | Épicloud || 7 | 7 | Quelque part dans le temps || 8 | 8 | Tranquillité d'esprit || 9 | 9 | Tueurs || 10 | 10 | Pas de prière pour les mourants || 11 | 11 | Pas de son sans silence || 12 | 12 | Grand visage de balançoire || 13 | 13 | Nuit Bleue || 14 | 14 | Éternité || 15 | 15 | Scandinavie || 16 | 16 | Valise perdue depuis longtemps || 17 | 17 | Louange et blâme || 18 | 18 | Le long est venu Jones || 19 | 19 | Toute la nuit est fausse || 20 | 20 | Les Seize Hommes de Tain || 21 | 21 | Yo Wassup || 22 | 22 | Cassé |+-------+-----------+--------------------------+
Dans ce cas, nous pouvons voir que les numéros de ligne s'alignent parfaitement avec les valeurs de AlbumId
colonne. C'est une pure coïncidence. Cela se produit parce que le AlbumId
la colonne utilise une valeur incrémentielle commençant à 1, ce qui est également ce que ROW_NUMBER()
les usages.
La numérotation des lignes est corrélée à l'AlbumId
colonne dans la mesure où elle est ordonnée par cette colonne. Mais cela ne signifie pas que les valeurs doivent être les mêmes.
Exemple 2 – Ajouter une clause WHERE
Ajout d'un WHERE
clause démontrera ce que je veux dire.
SELECT ROW_NUMBER() SUR (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsWHERE AlbumId> 15 ;
Résultat :
+-------+-----------+-------------------------+ | Ligne | ID d'album | Nom de l'album ||-------+-----------+-------------------------|| 1 | 16 | Valise perdue depuis longtemps || 2 | 17 | Louange et blâme || 3 | 18 | Le long est venu Jones || 4 | 19 | Toute la nuit est fausse || 5 | 20 | Les Seize Hommes de Tain || 6 | 21 | Yo Wassup || 7 | 22 | Cassé |+-------+-----------+-------------------------+Exemple 3 - Changer l'ordre
Le classement par ordre décroissant au lieu de l'ordre croissant illustre également ce concept.
SELECT ROW_NUMBER() SUR (ORDER BY AlbumId DESC) 'Row', AlbumId, AlbumNameFROM Albums ;Résultat :
+-------+-----------+-------------------------- +| Ligne | ID d'album | Nom de l'album ||-------+-----------+--------------------------| | 1 | 22 | Cassé || 2 | 21 | Yo Wassup || 3 | 20 | Les Seize Hommes de Tain || 4 | 19 | Toute la nuit est fausse || 5 | 18 | Le long est venu Jones || 6 | 17 | Louange et blâme || 7 | 16 | Valise perdue depuis longtemps || 8 | 15 | Scandinavie || 9 | 14 | Éternité || 10 | 13 | Nuit Bleue || 11 | 12 | Grand visage de balançoire || 12 | 11 | Pas de son sans silence || 13 | 10 | Pas de prière pour les mourants || 14 | 9 | Tueurs || 15 | 8 | Tranquillité d'esprit || 16 | 7 | Quelque part dans le temps || 17 | 6 | Épicloud || 18 | 5 | Victimes de Cool || 19 | 4 | Ziltoid l'Omniscient || 20 | 3 | Chanter sur la voie || 21 | 2 | Alimentation || 22 | 1 | Powerslave |+-------+-----------+--------------------------+Exemple 4 - Trier par une colonne différente
Et tant qu'on y est, trions par
AlbumName
colonne à la place.SELECT ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Row', AlbumId, AlbumNameFROM Albums ;Résultat :
+-------+-----------+-------------------------- +| Ligne | ID d'album | Nom de l'album ||-------+-----------+--------------------------| | 1 | 19 | Toute la nuit est fausse || 2 | 18 | Le long est venu Jones || 3 | 12 | Grand visage de balançoire || 4 | 13 | Nuit Bleue || 5 | 22 | Cassé || 6 | 5 | Victimes de Cool || 7 | 6 | Épicloud || 8 | 14 | Éternité || 9 | 9 | Tueurs || 10 | 16 | Valise perdue depuis longtemps || 11 | 10 | Pas de prière pour les mourants || 12 | 11 | Pas de son sans silence || 13 | 8 | Tranquillité d'esprit || 14 | 2 | Alimentation || 15 | 1 | Powerslave || 16 | 17 | Louange et blâme || 17 | 15 | Scandinavie || 18 | 3 | Chanter sur la voie || 19 | 7 | Quelque part dans le temps || 20 | 20 | Les Seize Hommes de Tain || 21 | 21 | Yo Wassup || 22 | 4 | Ziltoid l'Omniscient |+-------+-----------+------------------------- -+Exemple 5 – Partitions
Comme mentionné, vous pouvez également diviser les résultats en partitions. Lorsque vous faites cela, la numérotation recommence à 1 pour chaque nouvelle partition.
Exemple :
SELECT Genre, ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsINNER JOIN Genres ON Albums.GenreId =Genres.GenreId ;Résultat :
+---------+-------+-----------+---------------- ----------+| genre | Ligne | ID d'album | NomAlbum ||---------+-------+-----------+----------------- ---------|| Pays | 1 | 3 | Chanter sur la voie || Pays | 2 | 21 | Yo Wassup || Pays | 3 | 22 | Cassé || Jazz | 1 | 12 | Grand visage de balançoire || Jazz | 2 | 19 | Toute la nuit est fausse || Jazz | 3 | 20 | Les Seize Hommes de Tain || pop | 1 | 11 | Pas de son sans silence || pop | 2 | 13 | Nuit Bleue || pop | 3 | 14 | Éternité || pop | 4 | 15 | Scandinavie || pop | 5 | 16 | Valise perdue depuis longtemps || pop | 6 | 17 | Louange et blâme || pop | 7 | 18 | Le long est venu Jones || Rocher | 1 | 1 | Powerslave || Rocher | 2 | 2 | Alimentation || Rocher | 3 | 4 | Ziltoid l'Omniscient || Rocher | 4 | 5 | Victimes de Cool || Rocher | 5 | 6 | Épicloud || Rocher | 6 | 7 | Quelque part dans le temps || Rocher | 7 | 8 | Tranquillité d'esprit || Rocher | 8 | 9 | Tueurs || Rocher | 9 | 10 | Pas de prière pour les mourants |+---------+-------+-----------+------------- -------------+Une fois de plus, nous pouvons voir que le
ROW_NUMBER
et leAlbumId
les colonnes sont complètement non corrélées.Dans ce cas, je partitionne par le
Genre
colonne. Cela fait recommencer la numérotation à 1 pour chaque genre.