SQL
Fonctions (analytique)
Recherche…
Introduction
Vous utilisez des fonctions analytiques pour déterminer des valeurs basées sur des groupes de valeurs. Par exemple, vous pouvez utiliser ce type de fonction pour déterminer les totaux, les pourcentages ou le résultat supérieur d'un groupe.
Syntaxe
- FIRST_VALUE (expression_ scalaire) OVER ([partition_by_clause] order_by_clause [rows_range_clause])
- LAST_VALUE (expression_ scalaire) OVER ([partition_by_clause] order_by_clause [rows_range_clause])
- LAG (scalar_expression [, offset] [, default]) OVER ([partition_by_clause] order_by_clause)
- LEAD (scalar_expression [, offset], [default]) OVER ([partition_by_clause] order_by_clause)
- PERCENT_RANK () OVER ([partition_by_clause] order_by_clause)
- CUME_DIST () OVER ([partition_by_clause] order_by_clause)
- PERCENTILE_DISC (numeric_literal) WITHIN GROUP (ORDER BY order_by_expression [ASC | DESC]) OVER ([<partition_by_clause>])
- PERCENTILE_CONT (numeric_literal) WITHIN GROUP (ORDER BY order_by_expression [ASC | DESC]) OVER ([<partition_by_clause>])
FIRST_VALUE
Vous utilisez la fonction FIRST_VALUE
pour déterminer la première valeur d'un jeu de résultats ordonné, que vous identifiez à l'aide d'une expression scalaire.
SELECT StateProvinceID, Name, TaxRate,
FIRST_VALUE(StateProvinceID)
OVER(ORDER BY TaxRate ASC) AS FirstValue
FROM SalesTaxRate;
Dans cet exemple, la fonction FIRST_VALUE
est utilisée pour renvoyer l' ID
de l'état ou de la province ayant le taux de taxe le plus bas. La clause OVER
est utilisée pour ordonner les taux de taxe afin d'obtenir le taux le plus bas.
StateProvinceID | prénom | Taux d'imposition | Première valeur |
---|---|---|---|
74 | Taxe de vente de l'État de l'Utah | 5.00 | 74 |
36 | Taxe de vente de l'état du Minnesota | 6,75 | 74 |
30 | Massachusetts State Tax Tax | 7.00 | 74 |
1 | TPS canadienne | 7.00 | 74 |
57 | TPS canadienne | 7.00 | 74 |
63 | TPS canadienne | 7.00 | 74 |
LAST_VALUE
La fonction LAST_VALUE
fournit la dernière valeur d'un ensemble de résultats ordonnés, que vous spécifiez à l'aide d'une expression scalaire.
SELECT TerritoryID, StartDate, BusinessentityID,
LAST_VALUE(BusinessentityID)
OVER(ORDER BY TerritoryID) AS LastValue
FROM SalesTerritoryHistory;
Cet exemple utilise la fonction LAST_VALUE
pour renvoyer la dernière valeur de chaque jeu de lignes dans les valeurs LAST_VALUE
.
TerritoireID | Date de début | BusinessentityID | LastValue |
---|---|---|---|
1 | 2005-07-01 00.00.00.000 | 280 | 283 |
1 | 2006-11-01 00.00.00.000 | 284 | 283 |
1 | 2005-07-01 00.00.00.000 | 283 | 283 |
2 | 2007-01-01 00.00.00.000 | 277 | 275 |
2 | 2005-07-01 00.00.00.000 | 275 | 275 |
3 | 2007-01-01 00.00.00.000 | 275 | 277 |
LAG et LEAD
La fonction LAG
fournit des données sur les lignes avant la ligne en cours dans le même jeu de résultats. Par exemple, dans une SELECT
, vous pouvez comparer les valeurs de la ligne actuelle avec les valeurs d'une ligne précédente.
Vous utilisez une expression scalaire pour spécifier les valeurs à comparer. Le paramètre offset est le nombre de lignes avant la ligne en cours qui sera utilisé dans la comparaison. Si vous ne spécifiez pas le nombre de lignes, la valeur par défaut d'une ligne est utilisée.
Le paramètre par défaut spécifie la valeur à renvoyer lorsque l'expression à l'offset a une valeur NULL
. Si vous ne spécifiez pas de valeur, la valeur NULL
est renvoyée.
La fonction LEAD
fournit des données sur les lignes après la ligne en cours dans le jeu de lignes. Par exemple, dans une SELECT
, vous pouvez comparer les valeurs de la ligne en cours avec les valeurs de la ligne suivante.
Vous spécifiez les valeurs à comparer en utilisant une expression scalaire. Le paramètre offset est le nombre de lignes après la ligne en cours à utiliser dans la comparaison.
Vous spécifiez la valeur à renvoyer lorsque l'expression à l'offset a une valeur NULL
à l'aide du paramètre par défaut. Si vous ne spécifiez pas ces paramètres, la valeur par défaut d'une ligne est utilisée et la valeur NULL
est renvoyée.
SELECT BusinessEntityID, SalesYTD,
LEAD(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lead value",
LAG(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lag value"
FROM SalesPerson;
Cet exemple utilise les fonctions LEAD et LAG pour comparer les valeurs de vente de chaque employé à ce jour avec celles des employés répertoriés ci-dessus et ci-dessous, les enregistrements étant classés en fonction de la colonne BusinessEntityID.
BusinessEntityID | SalesYTD | Valeur de plomb | Valeur de retard |
---|---|---|---|
274 | 559697.5639 | 3763178.1787 | 0,0000 |
275 | 3763178.1787 | 4251368.5497 | 559697.5639 |
276 | 4251368.5497 | 3189418.3662 | 3763178.1787 |
277 | 3189418.3662 | 1453719.4653 | 4251368.5497 |
278 | 1453719.4653 | 2315185.6110 | 3189418.3662 |
279 | 2315185.6110 | 1352577.1325 | 1453719.4653 |
PERCENT_RANK et CUME_DIST
La fonction PERCENT_RANK
calcule le classement d'une ligne par rapport à l'ensemble de lignes. Le pourcentage est basé sur le nombre de lignes du groupe dont la valeur est inférieure à la ligne actuelle.
La première valeur du jeu de résultats a toujours un classement en pourcentage de zéro. La valeur de la plus haute ou de la dernière valeur du jeu est toujours une.
La fonction CUME_DIST
calcule la position relative d'une valeur spécifiée dans un groupe de valeurs en déterminant le pourcentage de valeurs inférieures ou égales à cette valeur. Cela s'appelle la distribution cumulative.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
PERCENT_RANK() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
AS "Percent Rank",
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
AS "Cumulative Distribution"
FROM Employee;
Dans cet exemple, vous utilisez une clause ORDER
pour partitionner ou grouper les lignes extraites par l' SELECT
en fonction des titres de travail des employés, les résultats de chaque groupe étant triés en fonction du nombre d'heures de congé de maladie utilisées par les employés.
BusinessEntityID | Profession | SickLeaveHours | Rang en pourcentage | Distribution cumulative |
---|---|---|---|---|
267 | Spécialiste d'application | 57 | 0 | 0,25 |
268 | Spécialiste d'application | 56 | 0.333333333333333 | 0,75 |
269 | Spécialiste d'application | 56 | 0.333333333333333 | 0,75 |
272 | Spécialiste d'application | 55 | 1 | 1 |
262 | Assistante du responsable financier Cheif | 48 | 0 | 1 |
239 | Spécialiste des avantages | 45 | 0 | 1 |
252 | Acheteur | 50 | 0 | 0.11111111111111111 |
251 | Acheteur | 49 | 0,125 | 0.333333333333333 |
256 | Acheteur | 49 | 0,125 | 0.333333333333333 |
253 | Acheteur | 48 | 0.375 | 0.555555555555555 |
254 | Acheteur | 48 | 0.375 | 0.555555555555555 |
La fonction PERCENT_RANK
classe les entrées dans chaque groupe. Pour chaque entrée, il renvoie le pourcentage d'entrées du même groupe qui ont des valeurs inférieures.
La fonction CUME_DIST
est similaire, sauf qu'elle renvoie le pourcentage de valeurs inférieures ou égales à la valeur actuelle.
PERCENTILE_DISC et PERCENTILE_CONT
La fonction PERCENTILE_DISC
répertorie la valeur de la première entrée où la distribution cumulative est supérieure au centile que vous fournissez à l'aide du paramètre numeric_literal
.
Les valeurs sont regroupées par jeu de lignes ou partition, comme spécifié par la clause WITHIN GROUP
.
La fonction PERCENTILE_CONT
est similaire à la fonction PERCENTILE_DISC
, mais renvoie la moyenne de la somme de la première entrée correspondante et de l'entrée suivante.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
AS "Cumulative Distribution",
PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Discreet"
FROM Employee;
Pour rechercher la valeur exacte de la ligne qui correspond ou dépasse le 0,5 centile, vous transmettez le percentile en tant que littéral numérique dans la fonction PERCENTILE_DISC
. La colonne Percentile Discreet d'un jeu de résultats répertorie la valeur de la ligne à laquelle la distribution cumulative est supérieure au centile spécifié.
BusinessEntityID | Profession | SickLeaveHours | Distribution cumulative | Centile discret |
---|---|---|---|---|
272 | Spécialiste d'application | 55 | 0,25 | 56 |
268 | Spécialiste d'application | 56 | 0,75 | 56 |
269 | Spécialiste d'application | 56 | 0,75 | 56 |
267 | Spécialiste d'application | 57 | 1 | 56 |
Pour baser le calcul sur un ensemble de valeurs, vous utilisez la fonction PERCENTILE_CONT
. La colonne "Percentile Continuous" dans les résultats indique la valeur moyenne de la somme de la valeur du résultat et de la valeur correspondante la plus élevée suivante.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
AS "Cumulative Distribution",
PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Discreet",
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Continuous"
FROM Employee;
BusinessEntityID | Profession | SickLeaveHours | Distribution cumulative | Centile discret | Percentile continu |
---|---|---|---|---|---|
272 | Spécialiste d'application | 55 | 0,25 | 56 | 56 |
268 | Spécialiste d'application | 56 | 0,75 | 56 | 56 |
269 | Spécialiste d'application | 56 | 0,75 | 56 | 56 |
267 | Spécialiste d'application | 57 | 1 | 56 | 56 |