FirebirdSQL logo

Fonctions de classement

Les fonctions de classement calculent le numéro de classement dans une section de Window.

Ces fonctions peuvent être utilisées avec ou sans sectionnement et triage, mais leur utilisation sans triage n’a presque jamais de sens.

Les fonctions de classement peuvent être utilisées pour créer différents types de compteurs incrémentaux. Considérons SUM(1) OVER (ORDER BY SALARY) comme un exemple de ce qu’elles peuvent faire, chacune d’une manière différente. Ci-dessous, une requête d’exemple pour comparer leur comportement par rapport à `SUM'.

SELECT
  id,
  salary,
  DENSE_RANK() OVER (ORDER BY salary),
  RANK() OVER (ORDER BY salary),
  PERCENT_RANK() OVER(ORDER BY salary),
  CUME_DIST() OVER(ORDER BY salary),
  NTILE(3) OVER(ORDER BY salary),
  ROW_NUMBER() OVER (ORDER BY salary),
  SUM(1) OVER (ORDER BY salary)
FROM employee
ORDER BY salary;
Résultat
id salary dense_rank rank      percent_rank         cume_dist ntile row_number sum
-- ------ ---------- ---- ----------------- ----------------- ----- ---------- ---
3    8.00          1    1 0.000000000000000 0.200000000000000     1          1   1
4    9.00          2    2 0.250000000000000 0.400000000000000     1          2   2
1   10.00          3    3 0.500000000000000 0.800000000000000     2          3   4
5   10.00          3    3 0.500000000000000 0.800000000000000     2          4   4
2   12.00          4    5 1.000000000000000 1.000000000000000     3          5   5

DENSE_RANK()

Disponible en

DSQL

Syntaxe
DENSE_RANK() OVER {<window_specification> | window_name}
Type de résultat de retour

BIGINT

Renvoie le rang des lignes dans la section de l’ensemble de résultats sans lacunes dans le classement. Les lignes avec les mêmes valeurs <order_exp> ont le même rang dans le groupe <partition_exp>, si spécifié. Le rang d’une ligne est égal au nombre de valeurs de rang différentes dans la section précédant la ligne actuelle, augmenté de un.

Example 1. Utilisation de DENSE_RANK
SELECT
  id,
  salary,
  DENSE_RANK() OVER (ORDER BY salary)
FROM employee
ORDER BY salary;
Résultat
id salary dense_rank
-- ------ ----------
3    8.00          1
4    9.00          2
1   10.00          3
5   10.00          3
2   12.00          4

RANK()

Disponible en

DSQL

Syntaxe
RANK() OVER {<window_specification> | window_name}
type de résultat de retour

BIGINT

Renvoie le rang de chaque ligne dans la section du jeu de résultats. Les lignes avec les mêmes valeurs <order_exp> ont le même rang dans le groupe <partition_exp> si spécifié. Le rang d’une ligne est calculé comme un plus le nombre de rangs avant cette ligne.

Example 1. utiliser RANK
SELECT
  id,
  salary,
  RANK() OVER (ORDER BY salary)
FROM employee
ORDER BY salary;
Résultat
id salary rank
-- ------ ------
3    8.00      1
4    9.00      2
1   10.00      3
5   10.00      3
2   12.00      5

PERCENT_RANK()

Disponible en

DSQL

Syntaxe
PERCENT_RANK() OVER {<window_specification> | window_name}
type de résultat de retour

DOUBLE PRECISION

Renvoie le rang relatif de la ligne actuelle dans un groupe de lignes. La fonction PERCENT_RANK est utilisée pour calculer la position relative d’une valeur dans une section ou un ensemble de requêtes résultant. La plage des valeurs renvoyées par PERCENT_RANK est supérieure à 0 et inférieure ou égale à 1. La première ligne de tout ensemble PERCENT_RANK est 0. Les valeurs NULL par défaut sont incluses et traitées comme les plus petites valeurs possibles.

Note

La fonction PERNCENT RANK est calculée comme (RANK-1)/(total_rows - 1), où total_rows est le nombre total de lignes dans la section.

Example 1. utiliser PERNCENT RANK
SELECT
  id,
  salary,
  PERCENT_RANK() OVER (ORDER BY salary)
FROM employee
ORDER BY salary;
Résultat
id salary percent_rank
-- ------ ------------
3    8.00          0.0
4    9.00         0.25
1   10.00          0.5
5   10.00          0.5
2   12.00          1.0