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

Comment numéroter les lignes en SQL

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