Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de ROW_NUMBER() dans SQL Server

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.

est requis. Il détermine l'ordre dans lequel les lignes reçoivent leur ROW_NUMBER unique dans une partition spécifiée.

Notez que le OVER la clause accepte normalement une , mais cet argument ne peut pas être utilisé avec cette fonction.

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 le AlbumId 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.