Catégories :

Fonctions de la fenêtre (lié au rang)

ROW_NUMBER

Renvoie un numéro de ligne unique pour chaque ligne d’une partition de fenêtre.

Le numéro de ligne commence à 1 et continue séquentiellement.

Syntaxe

ROW_NUMBER() OVER (
  [ PARTITION BY <expr1> [, <expr2> ... ] ]
  ORDER BY <expr3> [ , <expr4> ... ] [ { ASC | DESC } ]
  )
Copy

Arguments

Aucun.

Notes sur l’utilisation

  • expr1 et expr2 spécifient la ou les colonne(s) ou expression(s) à partitionner. Vous pouvez effectuer la partition par 0, 1 ou plusieurs expressions.

    Par exemple, supposons que vous sélectionniez des données de plusieurs états (ou provinces) et que vous souhaitiez des numéros de ligne compris entre 1 et N dans chaque état ; dans ce cas, vous pouvez partitionner par état.

    Si vous ne voulez qu’un seul groupe, omettez la clause PARTITION BY.

  • expr3 et expr4 spécifient la ou les colonnes ou expressions à utiliser pour déterminer l’ordre des lignes. Vous pouvez effectuer le classement par 1 ou plusieurs expressions.

    Par exemple, si vous souhaitez répertorier les agriculteurs par ordre de production de maïs, utilisez la colonne bushels_produced. Pour plus de détails, voir Exemples (dans ce chapitre).

Exemples

Affichez les agriculteurs par ordre décroissant en fonction de la quantité de maïs produite et attribuez les numéros de ligne dans cet ordre (l’agriculteur qui produit le plus de maïs porte le numéro de ligne 1).

SELECT state, bushels_produced, ROW_NUMBER()
  OVER (ORDER BY bushels_produced DESC)
  FROM corn_production;

+--------+------------------+------------+
|  state | bushels_produced | ROW_NUMBER |
+--------+------------------+------------+
| Kansas |              130 |           1|
| Kansas |              120 |           2|
| Iowa   |              110 |           3|
| Iowa   |              100 |           4|
+--------+------------------+------------+
Copy

La requête ci-dessous montre comment attribuer des numéros de ligne dans des partitions. Dans ce cas, les partitions sont des bourses d’échange (par exemple « N » pour « NASDAQ »).

SELECT
  symbol,
  exchange,
  shares,
  ROW_NUMBER() OVER (PARTITION BY exchange ORDER BY shares) AS row_number
FROM trades;

+------+--------+------+----------+
|SYMBOL|EXCHANGE|SHARES|ROW_NUMBER|
+------+--------+------+----------+
|SPY   |C       |   250|         1|
|AAPL  |C       |   250|         2|
|AAPL  |C       |   300|         3|
|SPY   |N       |   100|         1|
|AAPL  |N       |   300|         2|
|SPY   |N       |   500|         3|
|QQQ   |N       |   800|         4|
|QQQ   |N       |  2000|         5|
|YHOO  |N       |  5000|         6|
+------+--------+------+----------+
Copy