Problème :
Vous souhaitez attribuer à chaque ligne du tableau de résultats un numéro distinct.
Exemple :
Notre base de données contient une table nommée furniture
avec des données dans les colonnes suivantes :code
(clé primaire) et name
.
code | nom |
---|---|
101 | lit |
202 | canapé |
333 | chaise |
123 | bibliothèque |
235 | tableau |
766 | bureau |
Le furniture
table stocke le nom des meubles que l'on souhaite numéroter.
Solution :
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
La requête renvoie le numéro de ligne de chaque meuble ainsi que son nom et son code :
num_row | nom | code |
---|---|---|
1 | lit | 101 |
2 | canapé | 202 |
3 | chaise | 333 |
4 | bibliothèque | 123 |
5 | tableau | 235 |
6 | bureau | 766 |
A noter que les noms des meubles ne sont pas triés.
Discussion :
Si vous souhaitez numéroter chaque ligne dans un jeu de résultats, SQL fournit le ROW_NUMBER()
une fonction. Cette fonction est utilisée dans un SELECT
clause avec d'autres colonnes. Après le ROW_NUMBER()
clause, nous appelons la OVER()
une fonction. Si vous transmettez des arguments à OVER
, la numérotation des lignes ne sera triée selon aucune colonne. Ainsi, l'ordre des lignes affichées sera non déterministe; dans la plupart des cas, il s'agit de l'ordre dans lequel les enregistrements ont été insérés dans la table. La numérotation des lignes commence à 1. Dans notre exemple, chaque enregistrement porte un numéro de 1 à 6.
Nous pouvons également attribuer des numéros de ligne à l'aide d'une colonne. Dans l'exemple ci-dessous, nous numérotons les enregistrements triés par nom. Pour ce faire, nous transmettons cet argument à OVER
avec ORDER BY
(il trie les enregistrements en fonction de la colonne de nom) :
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Lorsque vous regardez le jeu de résultats, vous voyez les lignes triées avec leurs numéros :
ligne | nom | code |
---|---|---|
1 | lit | 101 |
2 | bibliothèque | 123 |
3 | chaise | 333 |
4 | bureau | 766 |
5 | canapé | 202 |
6 | tableau | 235 |
La numérotation fournie par ROW_NUMBER()
est indépendant de l'ordre des lignes dans le tableau de résultats. Dans l'exemple ci-dessous, nous numérotons les enregistrements en utilisant le nom de la colonne triée (OVER(ORDER BY name)
), mais nous affichons les enregistrements dans le jeu de résultats selon une autre colonne (dans notre exemple, ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
La requête a renvoyé le nombre de chaque ligne, mais ces nombres ne sont pas dans l'ordre croissant, car les enregistrements sont triés selon le code de colonne :
ligne | nom | code |
---|---|---|
1 | lit | 101 |
2 | bibliothèque | 123 |
5 | canapé | 202 |
6 | tableau | 235 |
3 | chaise | 333 |
4 | bureau | 766 |
L'ordre par défaut des lignes triées est croissant, mais vous pouvez également trier par ordre décroissant en utilisant le DESC
mot-clé après le nom de la colonne par laquelle vous souhaitez trier :
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
La requête ci-dessus a renvoyé le jeu de résultats :
ligne | nom | code |
---|---|---|
4 | bureau | 766 |
3 | chaise | 333 |
6 | tableau | 235 |
5 | canapé | 202 |
2 | bibliothèque | 123 |
1 | lit | 101 |