- Catégories :
Fonctions de la fenêtre (en lien avec le rang, cadre de fenêtre)
RANK¶
Renvoie le rang d’une valeur au sein d’un groupe ordonné de valeurs.
La valeur de rang commence à 1 et continue à la hausse.
Syntaxe¶
RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
Pour plus d’informations sur la syntaxe cadre_fenêtre
, voir Syntaxe et utilisation du cadre de fenêtre .
Arguments¶
Aucun.
La fonction elle-même ne prend aucun argument, car elle renvoie le rang (position relative) de la ligne en cours dans la fenêtre, qui est classée par <expr2>
. L’ordre de la fenêtre détermine le rang, il n’est donc pas nécessaire de transmettre un paramètre supplémentaire à la fonction RANK.
Notes sur l’utilisation¶
expr1
spécifie la colonne à partitionner.Par exemple, supposons que dans chaque état ou province, vous souhaitiez classer les agriculteurs par ordre de quantité de maïs produit. Dans ce cas, vous partitionnez par état.
Si vous souhaitez un seul groupe (par exemple, vous souhaitez classer tous les agriculteurs des États-Unis, quel que soit l’état dans lequel ils vivent), omettez la clause
PARTITION BY
.expr2
spécifie la colonne que vous souhaitez classer.Par exemple, si vous classez les agriculteurs pour voir qui produit le plus de maïs (dans leur état), utilisez la colonne
bushels_produced
. Pour plus de détails, voir Exemples (dans ce chapitre).Les valeurs égales donnent la même valeur de rang ; cependant, des lacunes dans la séquence seront causées en raison du nombre de valeurs égales (ex æquo).
Par exemple, si trois lignes renvoient
1
, RANK ignorera2
et3
et affectera4
à la ligne suivante du groupe.Pour éviter les espaces, utilisez plutôt la fonction DENSE_RANK.
Exemples¶
Affichez la production de maïs des agriculteurs par ordre décroissant, ainsi que le rang de la production de chaque agriculteur (valeur la plus élevée = 1
) :
SELECT state, bushels_produced, RANK() OVER (ORDER BY bushels_produced DESC) FROM corn_production; +--------+------------------+------+ | state | bushels_produced | RANK | +--------+------------------+------+ | Kansas | 130 | 1| | Kansas | 120 | 2| | Iowa | 110 | 3| | Iowa | 100 | 4| +--------+------------------+------+
Dans chaque état ou province, affichez la production de maïs des agriculteurs par ordre décroissant, ainsi que le rang de la production de chaque agriculteur (valeur la plus élevée = 1
) :
SELECT state, bushels_produced, RANK() OVER (PARTITION BY state ORDER BY bushels_produced) FROM corn_production; +--------+------------------+------+ | state | bushels_produced | RANK | +--------+------------------+------+ | Iowa | 110 | 1| | Iowa | 100 | 2| | Kansas | 130 | 1| | Kansas | 120 | 2| +--------+------------------+------+
Dans la requête et la sortie ci-dessous, les valeurs du symbole boursier SPY
indiquent comment les valeurs égales sont gérées (notez que les rangs sont 1
, 2
, 2
, 4
. Le rang 3
est ignoré. car il y avait une égalité pour le rang 2
) :
SELECT symbol, exchange, price, RANK() OVER (PARTITION BY symbol ORDER BY price) AS rank FROM trades; +------+--------+------+----+ |symbol|exchange|price |RANK| +------+--------+------+----+ |QQQ |Q | 83.99| 1| |QQQ |N | 84.35| 2| |QQQ |Q | 87.49| 3| |QQQ |N | 88.50| 4| |SPY |P |185.27| 1| |SPY |N |186.29| 2| |SPY |N |186.29| 2| |SPY |C |188.47| 4| |MSFT |Q | 38.77| 1| |MSFT |Q | 39.55| 2| |MSFT |P | 39.66| 3| |MSFT |P | 40.00| 4| |YHOO |N | 32.89| 1| |YHOO |Q | 33.49| 2| |YHOO |Q | 34.21| 3| |YHOO |P | 34.48| 4| |AAPL |P |568.33| 1| |AAPL |C |569.42| 2| |AAPL |C |570.37| 3| |AAPL |N |571.94| 4| +------+--------+------+----+