Les fonctions de fenêtre effectuent des agrégations ou d'autres calculs sur un sous-ensemble de données défini dynamiquement. Elles sont couramment utilisées pour le traitement des séries temporelles, le classement et le calcul de moyennes mobiles.
Remarques d'utilisation
Les fonctions de fenêtre ne peuvent apparaître que dans les instructions
SELECT.Une fonction de fenêtre ne peut pas être imbriquée avec d'autres fonctions de fenêtre ou des fonctions d'agrégation.
Les fonctions de fenêtre ne peuvent pas être utilisées conjointement avec des fonctions d'agrégation au même niveau.
Index
MaxCompute SQL prend en charge les fonctions de fenêtre suivantes.
|
Fonction |
Fonctionnalités |
|
Calcule la valeur moyenne des données dans une fenêtre. |
|
|
Effectue un échantillonnage aléatoire. Renvoie true si la ligne est échantillonnée. |
|
|
Compte le nombre d'enregistrements dans une fenêtre. |
|
|
Calcule la distribution cumulative. |
|
|
Calcule le rang. Les rangs sont consécutifs. |
|
|
Renvoie la valeur de la première ligne du cadre de fenêtre de la ligne actuelle. |
|
|
Renvoie la valeur de la Nième ligne précédant la ligne actuelle dans une partition. |
|
|
Renvoie la valeur de la dernière ligne du cadre de fenêtre de la ligne actuelle. |
|
|
Renvoie la valeur de la Nième ligne suivant la ligne actuelle dans une partition. |
|
|
Calcule la valeur maximale dans une fenêtre. |
|
|
Calcule la valeur médiane dans une fenêtre. |
|
|
Calcule la valeur minimale dans une fenêtre. |
|
|
Divise les données ordonnées en N groupes de taille égale et renvoie le numéro du groupe (de 1 à N) pour chaque ligne. |
|
|
Renvoie la valeur de la Nième ligne du cadre de fenêtre de la ligne actuelle. |
|
|
Calcule le rang sous forme de pourcentage. |
|
|
Calcule le centile exact. |
|
|
Calcule une valeur de centile donnée en triant la colonne spécifiée par ordre croissant. |
|
|
Calcule le rang. Les rangs peuvent ne pas être consécutifs. |
|
|
Calcule le numéro de ligne, en commençant par 1. |
|
|
Calcule l'écart type de la population. Il s'agit d'un alias pour STDDEV_POP. |
|
|
Calcule l'écart type de l'échantillon. |
|
|
Calcule la somme des données dans une fenêtre. |
Syntaxe des fonctions de fenêtre
Syntaxe des fonctions de fenêtre :
<function_name>([distinct][<expression> [, ...]]) over (<window_definition>)
<function_name>([distinct][<expression> [, ...]]) over <window_name>
function_name : une fonction de fenêtre intégrée, une fonction d'agrégation ou une fonction d'agrégation définie par l'utilisateur (UDAF).
expression : le format de la fonction, qui doit être conforme à la syntaxe de la fonction.
windowing_definition : la définition de la fenêtre. Pour plus d'informations sur la syntaxe, consultez la section windowing_definition.
-
window_name : le nom de la fenêtre. Vous pouvez utiliser le mot-clé
windowpour définir une fenêtre personnalisée et attribuer un nom à la windowing_definition. La syntaxe d'une définition de fenêtre nommée (named_window_def) est la suivante :window <window_name> as (<window_definition>)La section suivante décrit les positions des instructions personnalisées dans SQL :
select ... from ... [where ...] [group by ...] [having ...] named_window_def [order by ...] [limit ...]
windowing_definition
Syntaxe de windowing_definition :
--partition_clause:
[partition by <expression> [, ...]]
--orderby_clause:
[order by <expression> [asc|desc][nulls {first|last}] [, ...]]
[<frame_clause>]
Lorsque vous ajoutez une fonction de fenêtre à une instruction SELECT, les données sont partitionnées et triées en fonction des clauses partition by et order by de la définition de la fenêtre. Si vous ne spécifiez pas de clause partition by, toutes les données sont traitées comme une seule partition. Si vous ne spécifiez pas de clause order by, l'ordre des données au sein d'une partition n'est pas garanti. Pour chaque ligne, appelée ligne actuelle, un segment de données est extrait de la partition sur la base de la clause frame_clause afin de former la fenêtre pour cette ligne. La fonction de fenêtre calcule ensuite un résultat pour la ligne actuelle en fonction des données présentes dans sa fenêtre.
partition by <expression> [, ...] : facultatif. Spécifie la partition. Les lignes ayant les mêmes valeurs de colonne de clé de partition se trouvent dans la même partition. Pour plus d'informations sur le format, consultez la section Opérations sur les tables.
-
order by <expression> [asc|desc][nulls {first|last}] [, ...] : facultatif. Spécifie comment les données sont triées au sein d'une partition.
RemarqueSi les lignes ont les mêmes valeurs
order by, l'ordre de tri n'est pas garanti. Pour assurer un ordre cohérent, veillez à ce que les valeursorder bysoient aussi uniques que possible. frame_clause : facultatif. Définit les limites de la fenêtre. Pour plus d'informations sur frame_clause, consultez la section frame_clause.
filter_clause
Syntaxe de filter_clause :
FILTER (WHERE filter_condition)
filter_condition est une expression booléenne, utilisée de la même manière que la clause WHERE dans une instruction select ... from ... where.
Si vous fournissez une clause FILTER, seules les lignes pour lesquelles filter_condition est évaluée à true sont incluses dans le cadre de la fenêtre. Pour les fonctions de fenêtre d'agrégation (telles que COUNT, SUM, AVG, MAX et MIN), une valeur est toujours renvoyée pour chaque ligne. Toutefois, les lignes pour lesquelles l'expression FILTER n'est pas évaluée à true (par exemple NULL ou false) ne sont pas incluses dans le cadre de la fenêtre pour le calcul de chaque ligne. NULL est traité comme false.
Exemple
-
Préparation des données
-- Create a table. CREATE TABLE IF NOT EXISTS mf_window_fun(key BIGINT,value BIGINT) STORED AS ALIORC; -- Insert data. insert into mf_window_fun values (1,100),(2,200),(1,150),(2,250),(3,300),(4,400),(5,500),(6,600),(7,700); -- Query data from the mf_window_fun table. select * from mf_window_fun; -- The following result is returned: +------------+------------+ | key | value | +------------+------------+ | 1 | 100 | | 2 | 200 | | 1 | 150 | | 2 | 250 | | 3 | 300 | | 4 | 400 | | 5 | 500 | | 6 | 600 | | 7 | 700 | +------------+------------+ -
Interrogez la somme cumulative des lignes dont la valeur est supérieure à 100 dans la fenêtre.
select key,sum(value) filter(where value > 100) over (partition by key order by key) from mf_window_fun;Le résultat suivant est renvoyé :
+------------+------------+ | key | _c1 | +------------+------------+ | 1 | NULL | -- Skipped | 1 | 150 | | 2 | 200 | | 2 | 450 | | 3 | 300 | | 4 | 400 | | 5 | 500 | | 6 | 600 | | 7 | 700 | +------------+------------+
La clause FILTER ne supprime pas les lignes qui échouent à la condition filter_condition du résultat de la requête. Elle les exclut uniquement du calcul de la fonction de fenêtre. Pour supprimer ces lignes de la sortie finale, vous devez utiliser une clause
select ... from ... where. La valeur de la fonction de fenêtre pour une ligne exclue n'est pas 0 ou NULL. Au lieu de cela, elle hérite de la valeur de la ligne précédente.Vous pouvez utiliser la clause FILTER uniquement avec des fonctions de fenêtre d'agrégation, telles que COUNT, SUM, AVG, MAX, MIN et WM_CONCAT. Vous ne pouvez pas utiliser la clause FILTER avec des fonctions non agrégées telles que RANK, ROW_NUMBER ou NTILE. Dans le cas contraire, une erreur de syntaxe se produit.
Pour utiliser la syntaxe FILTER dans une fonction de fenêtre, vous devez activer l'indicateur de session suivant :
set odps.sql.window.function.newimpl=true;.
frame_clause
Syntaxe de frame_clause :
-- Format 1
{ROWS|RANGE|GROUPS} <frame_start> [<frame_exclusion>]
-- Format 2
{ROWS|RANGE|GROUPS} between <frame_start> and <frame_end> [<frame_exclusion>]
frame_clause est un intervalle fermé qui définit les limites de la fenêtre. Il inclut les lignes aux positions frame_start et frame_end.
-
ROWS|RANGE|GROUPS : obligatoire. Le type de frame_clause. Les règles d'implémentation pour frame_start et frame_end varient selon le type.
ROWS : définit les limites de la fenêtre en fonction du nombre de lignes.
RANGE : définit les limites de la fenêtre en comparant les valeurs de la colonne
order by. Généralement, une clauseorder byest spécifiée dans la définition de la fenêtre. Si aucune clauseorder byn'est spécifiée, toutes les lignes d'une partition ont la même valeur de colonneorder by. Les valeurs NULL sont considérées comme égales.GROUPS : toutes les lignes d'une partition ayant la même valeur de colonne
order byforment un GROUP. Si aucune clauseorder byn'est spécifiée, toutes les lignes de la partition forment un seul GROUP. Les valeurs NULL sont considérées comme égales.
-
frame_start et frame_end : spécifient les limites de début et de fin de la fenêtre. frame_start est obligatoire. frame_end est facultatif. S'il est omis, la valeur par défaut est CURRENT ROW.
La position spécifiée par frame_start doit précéder la position spécifiée par frame_end, ou correspondre à la position de frame_end. En d'autres termes, frame_start est plus proche du début de la partition que frame_end. Le début de la partition correspond à la position de la première ligne après le tri des données par l'instruction
order bydans la définition de la fenêtre. Le tableau suivant décrit les valeurs valides et la logique pour frame_start et frame_end lorsque le type de frame_clause est ROWS, RANGE ou GROUPS.Type de frame_clause
Valeur frame_start/frame_end
Description
ROWS, RANGE, GROUPS
UNBOUNDED PRECEDING
La première ligne de la partition. Le comptage commence à 1.
UNBOUNDED FOLLOWING
La dernière ligne de la partition.
ROWS
CURRENT ROW
La position de la ligne actuelle. Chaque ligne de données correspond à un résultat de fonction de fenêtre. La ligne actuelle est la ligne pour laquelle le résultat de la fonction de fenêtre est en cours de calcul.
offset PRECEDING
La position qui se trouve à
offsetlignes avant la ligne actuelle, vers le début de la partition. Par exemple,0 PRECEDINGfait référence à la ligne actuelle, et1 PRECEDINGfait référence à la ligne précédente.offsetdoit être un entier non négatif.offset FOLLOWING
La position qui se trouve à
offsetlignes après la ligne actuelle, vers la fin de la partition. Par exemple,0 FOLLOWINGfait référence à la ligne actuelle, et1 FOLLOWINGfait référence à la ligne suivante.offsetdoit être un entier non négatif.RANGE
CURRENT ROW
-
En tant que frame_start, il fait référence à la position de la première ligne ayant la même valeur de colonne
order byque la ligne actuelle. -
En tant que frame_end, il fait référence à la position de la dernière ligne ayant la même valeur de colonne
order byque la ligne actuelle.
offset PRECEDING
Les positions de frame_start et frame_end dépendent de la séquence
order by. Supposons que la fenêtre soit triée par X. Xi représente la valeur X de la i-ème ligne, et Xc représente la valeur X de la ligne actuelle. Les positions sont décrites comme suit :-
Lorsque
order byest croissant :-
frame_start : la position de la première ligne qui satisfait
Xc - Xi <= offset. -
frame_end : la position de la dernière ligne qui satisfait
Xc - Xi >= offset.
-
-
Lorsque
order byest décroissant :-
frame_start : la position de la première ligne qui satisfait
Xi - Xc <= offset. -
frame_end : la position de la dernière ligne qui satisfait
Xi - Xc >= offset.
-
Les types de données pris en charge pour la colonne
order bysont : TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, DATETIME, DATE et TIMESTAMP.La syntaxe pour l'
offsetdes types de date est la suivante :-
N: représente N jours ou N secondes. Il doit s'agir d'un entier non négatif. Pour DATETIME et TIMESTAMP, il représente N secondes. Pour DATE, il représente N jours. -
interval 'N' {YEAR\MONTH\DAY\HOUR\MINUTE\SECOND}: représente N années, mois, jours, heures, minutes ou secondes. Par exemple,INTERVAL '3' YEARreprésente 3 ans. -
INTERVAL 'N-M' YEAR TO MONTH: représente N années et M mois. Par exemple,INTERVAL '1-3' YEAR TO MONTHreprésente 1 an et 3 mois. -
INTERVAL 'D[ H[:M[:S[:N]]]]' DAY TO SECOND: représente D jours, H heures, M minutes, S secondes et N nanosecondes. Par exemple,INTERVAL '1 2:3:4:5' DAY TO SECONDreprésente 1 jour, 2 heures, 3 minutes, 4 secondes et 5 nanosecondes.
offset FOLLOWING
Les positions de frame_start et frame_end dépendent de la séquence
order by. Supposons que la fenêtre soit triée par X. Xi représente la valeur X de la i-ème ligne, et Xc représente la valeur X de la ligne actuelle. Les positions sont décrites comme suit :-
Lorsque
order byest croissant :-
frame_start : la position de la première ligne qui satisfait
Xi - Xc >= offset. -
frame_end : la position de la dernière ligne qui satisfait
Xi - Xc <= offset.
-
-
Lorsque
order byest décroissant :-
frame_start : la position de la première ligne qui satisfait
Xc - Xi >= offset. -
frame_end : la position de la dernière ligne qui satisfait
Xc - Xi <= offset.
-
GROUPS
CURRENT ROW
-
En tant que frame_start, il fait référence à la première ligne du GROUP auquel appartient la ligne actuelle.
-
En tant que frame_end, il fait référence à la dernière ligne du GROUP auquel appartient la ligne actuelle.
offset PRECEDING
-
En tant que frame_start, il fait référence à la position de la première ligne du GROUP qui se trouve à
offsetGROUPs avant le GROUP de la ligne actuelle, vers le début de la partition. -
En tant que frame_end, il fait référence à la position de la dernière ligne du GROUP qui se trouve à
offsetGROUPs avant le GROUP de la ligne actuelle, vers le début de la partition.
RemarqueVous ne pouvez pas définir frame_start sur UNBOUNDED FOLLOWING ni frame_end sur UNBOUNDED PRECEDING.
offset FOLLOWING
-
En tant que frame_start, il fait référence à la position de la première ligne du GROUP qui se trouve à
offsetGROUPs après le GROUP de la ligne actuelle, vers la fin de la partition. -
En tant que frame_end, il fait référence à la position de la dernière ligne du GROUP qui se trouve à
offsetGROUPs après le GROUP de la ligne actuelle, vers la fin de la partition.
RemarqueVous ne pouvez pas définir frame_start sur UNBOUNDED FOLLOWING ni frame_end sur UNBOUNDED PRECEDING.
-
-
frame_exclusion : facultatif. Utilisé pour exclure une partie des données de la fenêtre. Les valeurs valides sont :
EXCLUDE NO OTHERS : n'exclut aucune donnée.
EXCLUDE CURRENT ROW : exclut la ligne actuelle.
EXCLUDE GROUP : exclut l'intégralité du GROUP, c'est-à-dire toutes les données de la partition ayant la même valeur
order byque la ligne actuelle.EXCLUDE TIES : exclut toutes les lignes partageant la même valeur order by que la ligne actuelle, à l'exception de la ligne actuelle elle-même.
frame_clause par défaut
Si vous ne spécifiez pas de frame_clause, MaxCompute utilise une clause frame_clause par défaut pour déterminer les limites des données incluses dans la fenêtre. La clause frame_clause par défaut est la suivante :
-
Lorsque le mode compatible Hive est activé (
set odps.sql.hive.compatible=true;), la clause frame_clause par défaut est la suivante, ce qui correspond au comportement de la plupart des autres systèmes SQL.RANGE between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE NO OTHERS -
Lorsque le mode compatible Hive est désactivé (
set odps.sql.hive.compatible=false;), si une clauseorder byest spécifiée et que la fonction de fenêtre est AVG, COUNT, MAX, MIN, STDDEV, STDDEV_POP, STDDEV_SAMP ou SUM, la clause frame_clause par défaut est de type ROWS.ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE NO OTHERS
Exemples de limites de fenêtre
Supposons que la table tbl ait la structure pid: bigint, oid: bigint, rid: bigint et contienne les données suivantes :
+------------+------------+------------+
| pid | oid | rid |
+------------+------------+------------+
| 1 | NULL | 1 |
| 1 | NULL | 2 |
| 1 | 1 | 3 |
| 1 | 1 | 4 |
| 1 | 2 | 5 |
| 1 | 4 | 6 |
| 1 | 7 | 7 |
| 1 | 11 | 8 |
| 2 | NULL | 9 |
| 2 | NULL | 10 |
+------------+------------+------------+
-
Fenêtre de type ROW
-
Définition de fenêtre 1
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Définition de fenêtre 2
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | NULL | 2 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 3 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 4 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 2 | 5 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Définition de fenêtre 3
partition by pid order by oid ROWS between 1 FOLLOWING and 3 FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between 1 FOLLOWING and 3 FOLLOWING) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [2, 3, 4] | | 1 | NULL | 2 | [3, 4, 5] | | 1 | 1 | 3 | [4, 5, 6] | | 1 | 1 | 4 | [5, 6, 7] | | 1 | 2 | 5 | [6, 7, 8] | | 1 | 4 | 6 | [7, 8] | | 1 | 7 | 7 | [8] | | 1 | 11 | 8 | NULL | | 2 | NULL | 9 | [10] | | 2 | NULL | 10 | NULL | +------------+------------+------------+--------+ -
Définition de fenêtre 4
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | NULL | | 1 | NULL | 2 | [1] | | 1 | 1 | 3 | [1, 2] | | 1 | 1 | 4 | [1, 2, 3] | | 1 | 2 | 5 | [1, 2, 3, 4] | | 1 | 4 | 6 | [1, 2, 3, 4, 5] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7] | | 2 | NULL | 9 | NULL | | 2 | NULL | 10 | [9] | +------------+------------+------------+--------+ -
Définition de fenêtre 5
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | NULL | | 1 | NULL | 2 | NULL | | 1 | 1 | 3 | [1, 2] | | 1 | 1 | 4 | [1, 2] | | 1 | 2 | 5 | [1, 2, 3, 4] | | 1 | 4 | 6 | [1, 2, 3, 4, 5] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7] | | 2 | NULL | 9 | NULL | | 2 | NULL | 10 | NULL | +------------+------------+------------+--------+ -
Définition de fenêtre 6
partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1] | | 1 | NULL | 2 | [2] | | 1 | 1 | 3 | [1, 2, 3] | | 1 | 1 | 4 | [1, 2, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9] | | 2 | NULL | 10 | [10] | +------------+------------+------------+--------+En comparant les résultats de la colonne
windowpour les lignes oùridvaut 2, 4 et 10 dans cet exemple et le précédent, vous pouvez observer la différence entre EXCLUDE CURRENT ROW et EXCLUDE GROUP. Pour EXCLUDE GROUP, dans la même partition (oùpidest égal), toutes les données ayant la même valeuroidque la ligne actuelle sont exclues.
-
-
Fenêtre de type RANGE
-
Définition de fenêtre 1
partition by pid order by oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3, 4] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [1, 2, 3, 4, 5, 6] | | 1 | 7 | 7 | [1, 2, 3, 4, 5, 6, 7] | | 1 | 11 | 8 | [1, 2, 3, 4, 5, 6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+Lorsque CURRENT ROW est utilisé comme frame_end, il inclut toutes les lignes jusqu'à la dernière ligne ayant la même valeur
order byoidque la ligne actuelle. Par conséquent, le résultatwindowpour l'enregistrement oùridvaut 1 est [1, 2]. -
Définition de fenêtre 2
partition by pid order by oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | NULL | 2 | [1, 2, 3, 4, 5, 6, 7, 8] | | 1 | 1 | 3 | [3, 4, 5, 6, 7, 8] | | 1 | 1 | 4 | [3, 4, 5, 6, 7, 8] | | 1 | 2 | 5 | [5, 6, 7, 8] | | 1 | 4 | 6 | [6, 7, 8] | | 1 | 7 | 7 | [7, 8] | | 1 | 11 | 8 | [8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+ -
Définition de fenêtre 3
partition by pid order by oid RANGE between 3 PRECEDING and 1 PRECEDING --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid RANGE between 3 PRECEDING and 1 PRECEDING) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | NULL | | 1 | 1 | 4 | NULL | | 1 | 2 | 5 | [3, 4] | | 1 | 4 | 6 | [3, 4, 5] | | 1 | 7 | 7 | [6] | | 1 | 11 | 8 | NULL | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+Pour les lignes dont la valeur
order byoidest NULL, si vous utilisezoffset {PRECEDING|FOLLOWING}et queoffsetn'est pas UNBOUNDED, la limite est déterminée comme suit : lorsqu'il est utilisé comme frame_start, il pointe vers la première ligne ayant une valeurorder byNULL dans la partition. Lorsqu'il est utilisé comme frame_end, il pointe vers la dernière ligne ayant une valeurorder byNULL.
-
-
Fenêtre de type GROUPS
La définition de la fenêtre est la suivante :
partition by pid order by oid GROUPS between 2 PRECEDING and CURRENT ROW --SQL statement is as follows. select pid, oid, rid, collect_list(rid) over(partition by pid order by oid GROUPS between 2 PRECEDING and CURRENT ROW) as window from tbl;Le résultat suivant est renvoyé :
+------------+------------+------------+--------+ | pid | oid | rid | window | +------------+------------+------------+--------+ | 1 | NULL | 1 | [1, 2] | | 1 | NULL | 2 | [1, 2] | | 1 | 1 | 3 | [1, 2, 3, 4] | | 1 | 1 | 4 | [1, 2, 3, 4] | | 1 | 2 | 5 | [1, 2, 3, 4, 5] | | 1 | 4 | 6 | [3, 4, 5, 6] | | 1 | 7 | 7 | [5, 6, 7] | | 1 | 11 | 8 | [6, 7, 8] | | 2 | NULL | 9 | [9, 10] | | 2 | NULL | 10 | [9, 10] | +------------+------------+------------+--------+
Données d'exemple
Les exemples suivants utilisent ces données d'exemple. Créez et remplissez la table emp :
create table if not exists emp
(empno bigint,
ename string,
job string,
mgr bigint,
hiredate datetime,
sal bigint,
comm bigint,
deptno bigint);
tunnel upload emp.txt emp;
Le fichier emp.txt contient les données suivantes :
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10
AVG
-
Syntaxe
double avg([distinct] double <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) decimal avg([distinct] decimal <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur moyenne de expr dans une fenêtre.
-
Paramètres
-
expr : obligatoire. Expression pour laquelle calculer le résultat. Elle doit être de type DOUBLE ou DECIMAL.
Si la valeur d'entrée est de type STRING ou BIGINT, elle est implicitement convertie en type DOUBLE pour le calcul. Une erreur est renvoyée pour les autres types de données.
Si la valeur d'entrée est NULL, la ligne n'est pas incluse dans le calcul.
Si vous spécifiez le mot-clé distinct, la fonction calcule la moyenne des valeurs uniques.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez la section windowing_definition.
-
-
Valeur de retour
Si expr est de type DECIMAL, une valeur DECIMAL est renvoyée. Sinon, une valeur DOUBLE est renvoyée. Si toutes les valeurs de expr sont NULL, NULL est renvoyé.
-
Exemples
-
Exemple 1 : Partitionnez par département (deptno) et calculez le salaire moyen (sal) sans tri. La fonction calcule le salaire moyen pour l'ensemble de la partition (toutes les lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, avg(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2916.6666666666665 | -- This is the first row of the window. The value is the cumulative average from the first to the sixth row. | 10 | 2450 | 2916.6666666666665 | -- The value is the cumulative average from the first to the sixth row. | 10 | 5000 | 2916.6666666666665 | -- The value is the cumulative average from the first to the sixth row. | 10 | 1300 | 2916.6666666666665 | | 10 | 5000 | 2916.6666666666665 | | 10 | 2450 | 2916.6666666666665 | | 20 | 3000 | 2175.0 | | 20 | 3000 | 2175.0 | | 20 | 800 | 2175.0 | | 20 | 1100 | 2175.0 | | 20 | 2975 | 2175.0 | | 30 | 1500 | 1566.6666666666667 | | 30 | 950 | 1566.6666666666667 | | 30 | 1600 | 1566.6666666666667 | | 30 | 1250 | 1566.6666666666667 | | 30 | 1250 | 1566.6666666666667 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+ -
Exemple 2 : En mode non compatible Hive, partitionnez par département (deptno), triez par salaire (sal) et calculez le salaire moyen. La fonction calcule une moyenne cumulative de la première ligne de la partition à la ligne actuelle. Les commandes sont les suivantes :
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, avg(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300.0 | -- First row of the window. | 10 | 1300 | 1300.0 | -- Cumulative average from the first to the second row. | 10 | 2450 | 1683.3333333333333 | -- Cumulative average from the first to the third row. | 10 | 2450 | 1875.0 | -- Cumulative average from the first to the fourth row. | 10 | 5000 | 2500.0 | -- Cumulative average from the first to the fifth row. | 10 | 5000 | 2916.6666666666665 | -- Cumulative average from the first to the sixth row. | 20 | 800 | 800.0 | | 20 | 1100 | 950.0 | | 20 | 2975 | 1625.0 | | 20 | 3000 | 1968.75 | | 20 | 3000 | 2175.0 | | 30 | 950 | 950.0 | | 30 | 1250 | 1100.0 | | 30 | 1250 | 1150.0 | | 30 | 1500 | 1237.5 | | 30 | 1600 | 1310.0 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+ -
Exemple 3 : En mode compatible Hive, partitionnez par département (deptno), triez par salaire (sal) et calculez le salaire moyen. La fonction calcule une moyenne cumulative de la première ligne de la partition au dernier pair de la ligne actuelle (les lignes ayant le même sal ont la même moyenne). Les commandes sont les suivantes :
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, avg(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300.0 | -- First row of the window. Since the sal of the first and second rows are the same, the average for the first row is the cumulative average of the first two rows. | 10 | 1300 | 1300.0 | -- Cumulative average from the first to the second row. | 10 | 2450 | 1875.0 | -- Since the sal of the third and fourth rows are the same, the average for the third row is the cumulative average of the first four rows. | 10 | 2450 | 1875.0 | -- Cumulative average from the first to the fourth row. | 10 | 5000 | 2916.6666666666665 | | 10 | 5000 | 2916.6666666666665 | | 20 | 800 | 800.0 | | 20 | 1100 | 950.0 | | 20 | 2975 | 1625.0 | | 20 | 3000 | 2175.0 | | 20 | 3000 | 2175.0 | | 30 | 950 | 950.0 | | 30 | 1250 | 1150.0 | | 30 | 1250 | 1150.0 | | 30 | 1500 | 1237.5 | | 30 | 1600 | 1310.0 | | 30 | 2850 | 1566.6666666666667 | +------------+------------+------------+
-
CLUSTER_SAMPLE
-
Syntaxe
boolean cluster_sample(bigint <N>) OVER ([partition_clause]) boolean cluster_sample(bigint <N>, bigint <M>) OVER ([partition_clause]) -
Description
cluster_sample(bigint <N>): sélectionne aléatoirement N lignes dans la partition.cluster_sample(bigint <N>, bigint <M>): sélectionne aléatoirement une fraction de lignes (M/N) dans la partition. Le nombre de lignes sélectionnées est approximativement égal àpartition_row_count × M / N, oùpartition_row_countreprésente le nombre de lignes dans la partition.
-
Paramètres
N: Obligatoire. Une constante BIGINT. Si N a la valeur NULL, la valeur renvoyée est NULL.
M: Obligatoire. Une constante BIGINT. Si M a la valeur NULL, la valeur renvoyée est NULL.
partition_clause: Facultatif. Pour plus d'informations, consultez windowing_definition.
-
Valeur renvoyée
Renvoie une valeur BOOLEAN.
-
Exemple
Pour sélectionner environ 20 % des lignes de chaque groupe, exécutez la commande suivante :
select deptno, sal from ( select deptno, sal, cluster_sample(5, 1) over (partition by deptno) as flag from emp ) sub where flag = true;Le résultat suivant est renvoyé :
+------------+------------+ | deptno | sal | +------------+------------+ | 10 | 1300 | | 20 | 3000 | | 30 | 950 | +------------+------------+
COUNT
Syntaxe
-- Count the number of records.
BIGINT COUNT([DISTINCT|ALL] <colname>)
-- Count the number of records in the window.
BIGINT COUNT(*) OVER ([partition_clause] [orderby_clause] [frame_clause])
BIGINT COUNT([DISTINCT] <expr>[,...]) OVER ([partition_clause] [orderby_clause] [frame_clause])
Paramètres
|
Paramètre |
Obligatoire |
Description |
|
|
|
ALL` |
Non |
Contrôle la gestion des doublons. |
|
|
Oui |
La colonne à compter. Accepte tout type de données. Utilisez |
|
|
|
Oui |
Une expression de n'importe quel type de données. Les lignes NULL sont exclues. Avec |
|
|
|
Non |
Clauses de définition de fenêtre. Consultez Aperçu des fonctions de fenêtre. |
Valeur renvoyée
Renvoie une valeur BIGINT. Les lignes NULL sont exclues, sauf si vous utilisez COUNT(*).
Exemples
Préparation des données de test
Si vous disposez déjà de données, vous pouvez ignorer cette étape.
Téléchargez les données de test test_data.txt.
-
Créez une table de test.
CREATE TABLE IF NOT EXISTS emp( empno BIGINT, ename STRING, job STRING, mgr BIGINT, hiredate DATETIME, sal BIGINT, comm BIGINT, deptno BIGINT ); -
Chargez les données.
Remplacez
FILE_PATHpar le chemin et le nom réels de votre fichier de données.TUNNEL UPLOAD {{FILEPATH}} emp;
Exemple 1 : Partitionner une fenêtre sans tri
Partitionnez la fenêtre par sal. Sans ORDER BY, chaque ligne renvoie le nombre total de lignes dans sa partition.
SELECT sal, COUNT(sal) OVER (PARTITION BY sal) AS count
FROM emp;
Résultat :
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 2 | -- Two rows share sal=1250; both return 2.
| 1250 | 2 |
| 1300 | 2 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 2 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 2 |
| 3000 | 2 |
| 5000 | 2 |
| 5000 | 2 |
+------------+------------+
Exemple 2 : Partitionner une fenêtre avec tri (mode non compatible Hive)
En mode non compatible Hive, l'ajout de ORDER BY génère un compte cumulatif. Chaque ligne renvoie le nombre cumulé depuis la première ligne jusqu'à la ligne actuelle dans sa partition.
-- Disable Hive compatible mode.
SET odps.sql.hive.compatible=false;
SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count
FROM emp;
Résultat :
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 1 | -- Running count starts at 1 for the first row in the partition.
| 1250 | 2 | -- Increments to 2 for the second row.
| 1300 | 1 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 1 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 1 |
| 3000 | 2 |
| 5000 | 1 |
| 5000 | 2 |
+------------+------------+
Exemple 3 : Partitionner une fenêtre avec tri (mode compatible Hive)
En mode compatible Hive, ORDER BY ne génère pas de compte cumulatif. Chaque ligne de la partition renvoie le nombre total de la partition, comme si ORDER BY était omis.
-- Enable Hive compatible mode.
SET odps.sql.hive.compatible=true;
SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count
FROM emp;
Résultat :
+------------+------------+
| sal | count |
+------------+------------+
| 800 | 1 |
| 950 | 1 |
| 1100 | 1 |
| 1250 | 2 | -- Both rows in the partition return the full partition count.
| 1250 | 2 |
| 1300 | 2 |
| 1300 | 2 |
| 1500 | 1 |
| 1600 | 1 |
| 2450 | 2 |
| 2450 | 2 |
| 2850 | 1 |
| 2975 | 1 |
| 3000 | 2 |
| 3000 | 2 |
| 5000 | 2 |
| 5000 | 2 |
+------------+------------+
Exemple 4 : Compter toutes les lignes d'une table
SELECT COUNT(*) FROM emp;
Résultat :
+------------+
| _c0 |
+------------+
| 17 |
+------------+
Exemple 5 : Compter les lignes par groupe
Utilisez COUNT avec GROUP BY pour obtenir le nombre d'employés par département.
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
Résultat :
+------------+------------+
| deptno | _c1 |
+------------+------------+
| 20 | 5 |
| 30 | 6 |
| 10 | 6 |
+------------+------------+
Exemple 6 : Compter les valeurs uniques
Utilisez DISTINCT pour compter le nombre de départements distincts.
SELECT COUNT(DISTINCT deptno) FROM emp;
Résultat :
+------------+
| _c0 |
+------------+
| 3 |
+------------+
CUME_DIST
-
Syntaxe
double cume_dist() over([partition_clause] [orderby_clause]) -
Description
Calcule la distribution cumulative d'une valeur au sein d'un groupe de valeurs. Le résultat correspond au nombre de lignes dont les valeurs sont inférieures ou égales à la valeur de la ligne actuelle, divisé par le nombre total de lignes dans la partition. La comparaison est déterminée par la clause orderby_clause.
-
Paramètres
partition_clause et orderby_clause : Pour plus d'informations, consultez windowing_definition.
-
Valeur renvoyée
Renvoie une valeur DOUBLE. La valeur renvoyée spécifique est égale à
row_number_of_last_peer / partition_row_count, oùrow_number_of_last_peerest la valeur renvoyée par la fonction de fenêtre ROW_NUMBER pour la dernière ligne du groupe de la ligne actuelle, etpartition_row_countest le nombre de lignes dans la partition à laquelle appartient la ligne. -
Exemple
Partitionnez par département (deptno) et calculez la distribution cumulative du salaire (sal) au sein de chaque département. La commande est la suivante :
select deptno, ename, sal, concat(round(cume_dist() over (partition by deptno order by sal desc)*100,2),'%') as cume_dist from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | cume_dist | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 33.33% | | 10 | KING | 5000 | 33.33% | | 10 | CLARK | 2450 | 66.67% | | 10 | WELAN | 2450 | 66.67% | | 10 | TEBAGE | 1300 | 100.0% | | 10 | MILLER | 1300 | 100.0% | | 20 | SCOTT | 3000 | 40.0% | | 20 | FORD | 3000 | 40.0% | | 20 | JONES | 2975 | 60.0% | | 20 | ADAMS | 1100 | 80.0% | | 20 | SMITH | 800 | 100.0% | | 30 | BLAKE | 2850 | 16.67% | | 30 | ALLEN | 1600 | 33.33% | | 30 | TURNER | 1500 | 50.0% | | 30 | MARTIN | 1250 | 83.33% | | 30 | WARD | 1250 | 83.33% | | 30 | JAMES | 950 | 100.0% | +------------+------------+------------+------------+
DENSE_RANK
-
Syntaxe
bigint dense_rank() over ([partition_clause] [orderby_clause]) -
Description
Calcule le rang de la ligne actuelle au sein de sa partition en fonction de l'ordre de tri spécifié dans la clause orderby_clause. Le classement commence à 1. Les lignes ayant les mêmes valeurs
order bydans une partition reçoivent le même rang. Le rang s'incrémente de 1 chaque fois que la valeurorder bychange. -
Paramètres
partition_clause et orderby_clause : Pour plus d'informations, consultez windowing_definition.
-
Valeur renvoyée
Renvoie une valeur BIGINT. Si aucune clause orderby_clause n'est spécifiée, toutes les lignes reçoivent un rang de 1.
-
Exemple
Partitionnez par département (deptno) et classez les employés au sein de chaque département en fonction de leur salaire (sal) par ordre décroissant. La commande est la suivante :
select deptno, ename, sal, dense_rank() over (partition by deptno order by sal desc) as nums from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 2 | | 10 | WELAN | 2450 | 2 | | 10 | TEBAGE | 1300 | 3 | | 10 | MILLER | 1300 | 3 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 2 | | 20 | ADAMS | 1100 | 3 | | 20 | SMITH | 800 | 4 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 4 | | 30 | JAMES | 950 | 5 | +------------+------------+------------+------------+
FIRST_VALUE
-
Syntaxe
first_value(<expr>[, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur de l'expression expr de la première ligne du cadre de fenêtre.
-
Paramètres
expr : Obligatoire. L'expression pour laquelle calculer le résultat.
ignore_nulls : Facultatif. Une valeur BOOLEAN qui indique s'il faut ignorer les valeurs NULL. La valeur par défaut est False. Si ce paramètre est défini sur True, la fonction renvoie la première valeur non NULL de expr dans le cadre de fenêtre.
partition_clause, orderby_clause et frame_clause : Pour plus d'informations, consultez windowing_definition.
-
Valeur renvoyée
La valeur renvoyée possède le même type de données que expr.
-
Exemple
La commande suivante regroupe tous les employés par département et renvoie la première ligne de données de chaque groupe :
-
Sans spécifier order by :
select deptno, ename, sal, first_value(sal) over (partition by deptno) as first_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+-------------+ | deptno | ename | sal | first_value | +------------+------------+------------+-------------+ | 10 | TEBAGE | 1300 | 1300 | -- First row of the current window. | 10 | CLARK | 2450 | 1300 | | 10 | KING | 5000 | 1300 | | 10 | MILLER | 1300 | 1300 | | 10 | JACCKA | 5000 | 1300 | | 10 | WELAN | 2450 | 1300 | | 20 | FORD | 3000 | 3000 | -- First row of the current window. | 20 | SCOTT | 3000 | 3000 | | 20 | SMITH | 800 | 3000 | | 20 | ADAMS | 1100 | 3000 | | 20 | JONES | 2975 | 3000 | | 30 | TURNER | 1500 | 1500 | -- First row of the current window. | 30 | JAMES | 950 | 1500 | | 30 | ALLEN | 1600 | 1500 | | 30 | WARD | 1250 | 1500 | | 30 | MARTIN | 1250 | 1500 | | 30 | BLAKE | 2850 | 1500 | +------------+------------+------------+-------------+ -
Spécification de order by :
select deptno, ename, sal, first_value(sal) over (partition by deptno order by sal desc) as first_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+-------------+ | deptno | ename | sal | first_value | +------------+------------+------------+-------------+ | 10 | JACCKA | 5000 | 5000 | -- First row of the current window. | 10 | KING | 5000 | 5000 | | 10 | CLARK | 2450 | 5000 | | 10 | WELAN | 2450 | 5000 | | 10 | TEBAGE | 1300 | 5000 | | 10 | MILLER | 1300 | 5000 | | 20 | SCOTT | 3000 | 3000 | -- First row of the current window. | 20 | FORD | 3000 | 3000 | | 20 | JONES | 2975 | 3000 | | 20 | ADAMS | 1100 | 3000 | | 20 | SMITH | 800 | 3000 | | 30 | BLAKE | 2850 | 2850 | -- First row of the current window. | 30 | ALLEN | 1600 | 2850 | | 30 | TURNER | 1500 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | JAMES | 950 | 2850 | +------------+------------+------------+-------------+
-
LAG
-
Syntaxe
lag(<expr>[,bigint <offset>[, <default>]]) over([partition_clause] orderby_clause) -
Description
Renvoie la valeur de l'expression expr de la ligne située offset lignes avant la ligne actuelle (vers le début de la partition). L'expression expr peut être une colonne, une opération sur une colonne ou une opération de fonction.
-
Paramètres
expr : Obligatoire. L'expression à calculer.
offset : Facultatif. Le décalage, qui est une constante BIGINT supérieure ou égale à 1. Une valeur de 1 indique la ligne précédente. La valeur par défaut est 1. Si la valeur d'entrée est de type STRING ou DOUBLE, elle est implicitement convertie en type BIGINT pour le calcul.
default : Facultatif. Spécifie une valeur par défaut à renvoyer lorsque le offset est hors limites. Si ce paramètre n'est pas spécifié, la valeur par défaut est NULL. La valeur doit être une constante du même type de données que expr. Si expr n'est pas une constante, cette valeur est évaluée en fonction de la ligne actuelle.
partition_clause et orderby_clause : Pour plus d'informations, consultez windowing_definition.
-
Valeur renvoyée
La valeur renvoyée possède le même type de données que expr.
-
Exemple
Partitionnez par département (deptno) et récupérez le salaire (sal) de la ligne précédente pour chaque employé. La commande est la suivante :
select deptno, ename, sal, lag(sal, 1) over (partition by deptno order by sal) as sal_new from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | NULL | | 10 | MILLER | 1300 | 1300 | | 10 | CLARK | 2450 | 1300 | | 10 | WELAN | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | JACCKA | 5000 | 5000 | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | 800 | | 20 | JONES | 2975 | 1100 | | 20 | SCOTT | 3000 | 2975 | | 20 | FORD | 3000 | 3000 | | 30 | JAMES | 950 | NULL | | 30 | MARTIN | 1250 | 950 | | 30 | WARD | 1250 | 1250 | | 30 | TURNER | 1500 | 1250 | | 30 | ALLEN | 1600 | 1500 | | 30 | BLAKE | 2850 | 1600 | +------------+------------+------------+------------+
LAST_VALUE
-
Syntaxe
last_value(<expr>[, <ignore_nulls>]) over([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur de l'expression expr issue de la dernière ligne du cadre de fenêtre.
Paramètres
expr : obligatoire. Expression à évaluer.
ignore_nulls : facultatif. Valeur BOOLEAN indiquant s'il faut ignorer les valeurs NULL. La valeur par défaut est False. Si ce paramètre est défini sur True, la fonction renvoie la dernière valeur non NULL de expr dans le cadre de fenêtre.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez la section windowing_definition.
-
Valeur de retour
La valeur de retour possède le même type de données que expr.
-
Exemple
La commande suivante regroupe tous les employés par département et renvoie la dernière ligne de données de chaque groupe :
-
Sans clause order by, le cadre de fenêtre inclut toutes les lignes de la partition. La fonction renvoie la valeur de la dernière ligne de la partition.
select deptno, ename, sal, last_value(sal) over (partition by deptno) as last_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+-------------+ | deptno | ename | sal | last_value | +------------+------------+------------+-------------+ | 10 | TEBAGE | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | MILLER | 1300 | 2450 | | 10 | JACCKA | 5000 | 2450 | | 10 | WELAN | 2450 | 2450 | -- Last row of the current window. | 20 | FORD | 3000 | 2975 | | 20 | SCOTT | 3000 | 2975 | | 20 | SMITH | 800 | 2975 | | 20 | ADAMS | 1100 | 2975 | | 20 | JONES | 2975 | 2975 | -- Last row of the current window. | 30 | TURNER | 1500 | 2850 | | 30 | JAMES | 950 | 2850 | | 30 | ALLEN | 1600 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | BLAKE | 2850 | 2850 | -- Last row of the current window. +------------+------------+------------+-------------+ -
Avec une clause order by, le cadre de fenêtre par défaut est
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. La fonction renvoie la valeur de la ligne actuelle.select deptno, ename, sal, last_value(sal) over (partition by deptno order by sal desc) as last_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+-------------+ | deptno | ename | sal | last_value | +------------+------------+------------+-------------+ | 10 | JACCKA | 5000 | 5000 | -- Current row of the current window. | 10 | KING | 5000 | 5000 | -- Current row of the current window. | 10 | CLARK | 2450 | 2450 | -- Current row of the current window. | 10 | WELAN | 2450 | 2450 | -- Current row of the current window. | 10 | TEBAGE | 1300 | 1300 | -- Current row of the current window. | 10 | MILLER | 1300 | 1300 | -- Current row of the current window. | 20 | SCOTT | 3000 | 3000 | -- Current row of the current window. | 20 | FORD | 3000 | 3000 | -- Current row of the current window. | 20 | JONES | 2975 | 2975 | -- Current row of the current window. | 20 | ADAMS | 1100 | 1100 | -- Current row of the current window. | 20 | SMITH | 800 | 800 | -- Current row of the current window. | 30 | BLAKE | 2850 | 2850 | -- Current row of the current window. | 30 | ALLEN | 1600 | 1600 | -- Current row of the current window. | 30 | TURNER | 1500 | 1500 | -- Current row of the current window. | 30 | MARTIN | 1250 | 1250 | -- Current row of the current window. | 30 | WARD | 1250 | 1250 | -- Current row of the current window. | 30 | JAMES | 950 | 950 | -- Current row of the current window. +------------+------------+------------+-------------+
-
LEAD
-
Syntaxe
lead(<expr>[, bigint <offset>[, <default>]]) over([partition_clause] orderby_clause) -
Description
Renvoie la valeur de l'expression expr issue de la ligne située offset lignes après la ligne actuelle (vers la fin de la partition). L'expression expr peut être une colonne, une opération sur une colonne ou une opération de fonction.
-
Paramètres
expr : obligatoire. Expression à évaluer.
offset : facultatif. Décalage, représenté par une constante BIGINT supérieure ou égale à 0. Une valeur de 0 indique la ligne actuelle et une valeur de 1 indique la ligne suivante. La valeur par défaut est 1. Si la valeur d'entrée est de type STRING ou DOUBLE, elle est implicitement convertie en type BIGINT pour le calcul.
default : facultatif. Valeur à renvoyer si le offset est hors limites. Cette valeur doit être une constante du même type de données que expr. La valeur par défaut est NULL. Si expr n'est pas une constante, la valeur est évaluée en fonction de la ligne actuelle.
partition_clause et orderby_clause : pour plus d'informations, consultez la section windowing_definition.
-
Valeur de retour
La valeur de retour possède le même type de données que expr.
-
Exemple
Partitionnez par département (deptno) et récupérez le salaire (sal) de la ligne suivante pour chaque employé. La commande est la suivante :
select deptno, ename, sal, lead(sal, 1) over (partition by deptno order by sal) as sal_new from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | 1300 | | 10 | MILLER | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | WELAN | 2450 | 5000 | | 10 | KING | 5000 | 5000 | | 10 | JACCKA | 5000 | NULL | | 20 | SMITH | 800 | 1100 | | 20 | ADAMS | 1100 | 2975 | | 20 | JONES | 2975 | 3000 | | 20 | SCOTT | 3000 | 3000 | | 20 | FORD | 3000 | NULL | | 30 | JAMES | 950 | 1250 | | 30 | MARTIN | 1250 | 1250 | | 30 | WARD | 1250 | 1500 | | 30 | TURNER | 1500 | 1600 | | 30 | ALLEN | 1600 | 2850 | | 30 | BLAKE | 2850 | NULL | +------------+------------+------------+------------+
MAX
-
Syntaxe
max(<expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur maximale de expr dans une fenêtre.
-
Paramètres
expr : obligatoire. Expression utilisée pour calculer la valeur maximale. Elle peut être de n'importe quel type de données, à l'exception de BOOLEAN. Si la valeur est NULL, la ligne n'est pas incluse dans le calcul.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez la section windowing_definition.
-
Valeur de retour
La valeur de retour possède le même type de données que expr.
-
Exemples
-
Exemple 1 : Partitionnez par département (deptno), calculez le salaire maximal (sal) sans tri. La fonction renvoie la valeur maximale de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, max(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 5000 | -- First row of the window. The value is the maximum from the first to the sixth row. | 10 | 2450 | 5000 | -- The value is the maximum from the first to the sixth row. | 10 | 5000 | 5000 | -- The value is the maximum from the first to the sixth row. | 10 | 1300 | 5000 | | 10 | 5000 | 5000 | | 10 | 2450 | 5000 | | 20 | 3000 | 3000 | | 20 | 3000 | 3000 | | 20 | 800 | 3000 | | 20 | 1100 | 3000 | | 20 | 2975 | 3000 | | 30 | 1500 | 2850 | | 30 | 950 | 2850 | | 30 | 1600 | 2850 | | 30 | 1250 | 2850 | | 30 | 1250 | 2850 | | 30 | 2850 | 2850 | +------------+------------+------------+ -
Exemple 2 : Partitionnez par département (deptno), calculez le salaire maximal (sal) et triez les résultats. La fonction renvoie la valeur maximale de la première ligne à la ligne actuelle de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, max(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 1300 | -- Maximum value from the first to the second row. | 10 | 2450 | 2450 | -- Maximum value from the first to the third row. | 10 | 2450 | 2450 | -- Maximum value from the first to the fourth row. | 10 | 5000 | 5000 | | 10 | 5000 | 5000 | | 20 | 800 | 800 | | 20 | 1100 | 1100 | | 20 | 2975 | 2975 | | 20 | 3000 | 3000 | | 20 | 3000 | 3000 | | 30 | 950 | 950 | | 30 | 1250 | 1250 | | 30 | 1250 | 1250 | | 30 | 1500 | 1500 | | 30 | 1600 | 1600 | | 30 | 2850 | 2850 | +------------+------------+------------+
-
MEDIAN
-
Syntaxe
median(<expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Calcule la médiane de expr dans une fenêtre.
-
Paramètres
-
expr : obligatoire. Expression pour laquelle calculer la médiane. Elle doit être de type DOUBLE ou DECIMAL.
Si la valeur d'entrée est de type STRING ou BIGINT, elle est implicitement convertie en type DOUBLE pour le calcul. Une erreur est renvoyée pour les autres types de données.
Si l'entrée est NULL, la valeur de retour est NULL.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez la section windowing_definition.
-
-
Valeur de retour
Renvoie une valeur DOUBLE ou DECIMAL. Si toutes les valeurs de expr sont NULL, NULL est renvoyé.
-
Exemple
Partitionnez par département (deptno) et calculez le salaire médian (sal). La fonction renvoie la médiane pour l'ensemble de la partition (toutes les lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, median(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2450.0 | -- First row of the window. The value is the median from the first to the sixth row. | 10 | 2450 | 2450.0 | | 10 | 5000 | 2450.0 | | 10 | 1300 | 2450.0 | | 10 | 5000 | 2450.0 | | 10 | 2450 | 2450.0 | | 20 | 3000 | 2975.0 | | 20 | 3000 | 2975.0 | | 20 | 800 | 2975.0 | | 20 | 1100 | 2975.0 | | 20 | 2975 | 2975.0 | | 30 | 1500 | 1375.0 | | 30 | 950 | 1375.0 | | 30 | 1600 | 1375.0 | | 30 | 1250 | 1375.0 | | 30 | 1250 | 1375.0 | | 30 | 2850 | 1375.0 | +------------+------------+------------+
MIN
-
Syntaxe
min(<expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur minimale de expr dans une fenêtre.
-
Paramètres
expr : obligatoire. Expression utilisée pour calculer la valeur minimale. Elle peut être de n'importe quel type de données, à l'exception de BOOLEAN. Si la valeur est NULL, la ligne n'est pas incluse dans le calcul.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez la section windowing_definition.
-
Valeur de retour
La valeur de retour possède le même type de données que expr.
-
Exemples
-
Exemple 1 : Partitionnez par département (deptno), calculez le salaire minimal (sal) sans tri. La fonction renvoie la valeur minimale de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, min(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. The value is the minimum from the first to the sixth row. | 10 | 2450 | 1300 | -- The value is the minimum from the first to the sixth row. | 10 | 5000 | 1300 | -- The value is the minimum from the first to the sixth row. | 10 | 1300 | 1300 | | 10 | 5000 | 1300 | | 10 | 2450 | 1300 | | 20 | 3000 | 800 | | 20 | 3000 | 800 | | 20 | 800 | 800 | | 20 | 1100 | 800 | | 20 | 2975 | 800 | | 30 | 1500 | 950 | | 30 | 950 | 950 | | 30 | 1600 | 950 | | 30 | 1250 | 950 | | 30 | 1250 | 950 | | 30 | 2850 | 950 | +------------+------------+------------+ -
Exemple 2 : Partitionnez par département (deptno), calculez le salaire minimal (sal) et triez les résultats. La fonction renvoie la valeur minimale de la première ligne à la ligne actuelle de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, min(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 1300 | -- Minimum value from the first to the second row. | 10 | 2450 | 1300 | -- Minimum value from the first to the third row. | 10 | 2450 | 1300 | | 10 | 5000 | 1300 | | 10 | 5000 | 1300 | | 20 | 800 | 800 | | 20 | 1100 | 800 | | 20 | 2975 | 800 | | 20 | 3000 | 800 | | 20 | 3000 | 800 | | 30 | 950 | 950 | | 30 | 1250 | 950 | | 30 | 1250 | 950 | | 30 | 1500 | 950 | | 30 | 1600 | 950 | | 30 | 2850 | 950 | +------------+------------+------------+
-
NTILE
-
Syntaxe
bigint ntile(bigint <N>) over ([partition_clause] [orderby_clause]) -
Description
Divise les lignes ordonnées d'une partition en N groupes de taille aussi égale que possible et renvoie le numéro de groupe pour chaque ligne. Si le nombre de lignes n'est pas divisible exactement par N, les premiers groupes (ceux avec des numéros de groupe plus petits) contiendront une ligne supplémentaire.
-
Paramètres
N : obligatoire. Nombre de groupes. Valeur BIGINT.
partition_clause et orderby_clause : pour plus d'informations, consultez la section windowing_definition.
-
Valeur de retour
Renvoie une valeur BIGINT.
-
Exemple
Divisez tous les employés en 3 groupes au sein de chaque département en fonction du salaire (sal) par ordre décroissant et renvoyez le numéro de groupe pour chaque employé. La commande est la suivante :
select deptno, ename, sal, ntile(3) over (partition by deptno order by sal desc) as nt3 from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nt3 | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 2 | | 10 | WELAN | 2450 | 2 | | 10 | TEBAGE | 1300 | 3 | | 10 | MILLER | 1300 | 3 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 2 | | 20 | ADAMS | 1100 | 2 | | 20 | SMITH | 800 | 3 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 1 | | 30 | TURNER | 1500 | 2 | | 30 | MARTIN | 1250 | 2 | | 30 | WARD | 1250 | 3 | | 30 | JAMES | 950 | 3 | +------------+------------+------------+------------+
NTH_VALUE
-
Syntaxe
nth_value(<expr>, <number> [, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la valeur de l'expression expr issue de la N-ième ligne du cadre de fenêtre.
-
Paramètres
expr : obligatoire. Expression à calculer.
number : obligatoire. Valeur BIGINT. Entier supérieur ou égal à 1. Si la valeur est 1, cette fonction équivaut à FIRST_VALUE.
ignore_nulls : facultatif. Valeur BOOLEAN indiquant s'il faut ignorer les valeurs NULL. La valeur par défaut est False. Si ce paramètre est défini sur True, la fonction renvoie la N-ième valeur non NULL de expr dans le cadre de fenêtre.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez windowing_definition.
-
Valeur de retour
La valeur de retour possède le même type de données que expr.
-
Exemple
La commande suivante regroupe tous les employés par département et renvoie la sixième ligne de données de chaque groupe :
-
Sans clause order by, le cadre de fenêtre inclut toutes les lignes de la partition. La fonction renvoie la valeur de la sixième ligne de la partition.
select deptno, ename, sal, nth_value(sal,6) over (partition by deptno) as nth_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nth_value | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | 2450 | | 10 | CLARK | 2450 | 2450 | | 10 | KING | 5000 | 2450 | | 10 | MILLER | 1300 | 2450 | | 10 | JACCKA | 5000 | 2450 | | 10 | WELAN | 2450 | 2450 | -- 6th row of the current window. | 20 | FORD | 3000 | NULL | | 20 | SCOTT | 3000 | NULL | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | NULL | | 20 | JONES | 2975 | NULL | -- The current window does not have a 6th row, so NULL is returned. | 30 | TURNER | 1500 | 2850 | | 30 | JAMES | 950 | 2850 | | 30 | ALLEN | 1600 | 2850 | | 30 | WARD | 1250 | 2850 | | 30 | MARTIN | 1250 | 2850 | | 30 | BLAKE | 2850 | 2850 | -- 6th row of the current window. +------------+------------+------------+------------+ -
Avec une clause order by, le cadre de fenêtre par défaut est
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. La fonction renvoie la valeur de la sixième ligne du cadre de fenêtre.select deptno, ename, sal, nth_value(sal,6) over (partition by deptno order by sal) as nth_value from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nth_value | +------------+------------+------------+------------+ | 10 | TEBAGE | 1300 | NULL | | 10 | MILLER | 1300 | NULL | -- The current window has only 2 rows, so the 6th row exceeds the window length. | 10 | CLARK | 2450 | NULL | | 10 | WELAN | 2450 | NULL | | 10 | KING | 5000 | 5000 | | 10 | JACCKA | 5000 | 5000 | | 20 | SMITH | 800 | NULL | | 20 | ADAMS | 1100 | NULL | | 20 | JONES | 2975 | NULL | | 20 | SCOTT | 3000 | NULL | | 20 | FORD | 3000 | NULL | | 30 | JAMES | 950 | NULL | | 30 | MARTIN | 1250 | NULL | | 30 | WARD | 1250 | NULL | | 30 | TURNER | 1500 | NULL | | 30 | ALLEN | 1600 | NULL | | 30 | BLAKE | 2850 | 2850 | +------------+------------+------------+------------+
-
PERCENT_RANK
-
Syntaxe
double percent_rank() over([partition_clause] [orderby_clause]) -
Description
Calcule le rang percentile de la ligne actuelle au sein de sa partition, selon l'ordre de tri spécifié par orderby_clause.
-
Paramètres
partition_clause et orderby_clause : pour plus d'informations, consultez windowing_definition.
-
Valeur de retour
Renvoie une valeur DOUBLE comprise dans l'intervalle [0,0 ; 1,0]. La valeur de retour spécifique est égale à
“(rank - 1) / (partition_row_count - 1)”, oùrankcorrespond au résultat de la fonction de fenêtre RANK pour cette ligne, etpartition_row_countreprésente le nombre de lignes dans la partition à laquelle appartient la ligne. Si la partition ne contient qu'une seule ligne, la sortie est 0,0. -
Exemple
Calculez le rang percentile du salaire de chaque employé au sein de son département. La commande est la suivante :
select deptno, ename, sal, percent_rank() over (partition by deptno order by sal desc) as sal_new from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | sal_new | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 0.0 | | 10 | KING | 5000 | 0.0 | | 10 | CLARK | 2450 | 0.4 | | 10 | WELAN | 2450 | 0.4 | | 10 | TEBAGE | 1300 | 0.8 | | 10 | MILLER | 1300 | 0.8 | | 20 | SCOTT | 3000 | 0.0 | | 20 | FORD | 3000 | 0.0 | | 20 | JONES | 2975 | 0.5 | | 20 | ADAMS | 1100 | 0.75 | | 20 | SMITH | 800 | 1.0 | | 30 | BLAKE | 2850 | 0.0 | | 30 | ALLEN | 1600 | 0.2 | | 30 | TURNER | 1500 | 0.4 | | 30 | MARTIN | 1250 | 0.6 | | 30 | WARD | 1250 | 0.6 | | 30 | JAMES | 950 | 1.0 | +------------+------------+------------+------------+
PERCENTILE_CONT
-
Syntaxe
-- Calculate the exact percentile PERCENTILE_CONT(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) -- Calculate the exact percentile in a window PERCENTILE_CONT(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) OVER ([partition_clause] [orderby_clause]) -
Description
Calcule le centile exact. Cette fonction utilise un algorithme d'interpolation linéaire, trie la colonne spécifiée par ordre croissant et renvoie la valeur exacte au percentile indiqué.
-
Paramètres
col_name : obligatoire. Colonne de type DOUBLE ou DECIMAL.
percentile : obligatoire. Centile à calculer. Constante DOUBLE comprise dans l'intervalle [0, 1].
isIgnoreNull : facultatif. Indique s'il faut ignorer les valeurs NULL. Constante BOOLEAN. La valeur par défaut est TRUE. Si elle est définie sur FALSE, les valeurs NULL sont traitées comme la valeur minimale lors du tri.
partition_clause et orderby_clause : pour plus d'informations, consultez windowing_definition..
-
Valeur de retour
Renvoie la valeur du centile calculée sous forme de DOUBLE.
-
Exemples
-
Exemple 1 : ignorez les valeurs NULL et calculez le centile exact dans une fenêtre.
SELECT PERCENTILE_CONT(x, 0) OVER() AS min, PERCENTILE_CONT(x, 0.01) OVER() AS percentile1, PERCENTILE_CONT(x, 0.5) OVER() AS median, PERCENTILE_CONT(x, 0.9) OVER() AS percentile90, PERCENTILE_CONT(x, 1) OVER() AS max FROM VALUES(0D),(3D),(NULL),(1D),(2D) AS tbl(x) LIMIT 1; -- Return result +------------+-------------+------------+--------------+------------+ | min | percentile1 | median | percentile90 | max | +------------+-------------+------------+--------------+------------+ | 0.0 | 0.03 | 1.5 | 2.7 | 3.0 | +------------+-------------+------------+--------------+------------+ -
Exemple 2 : n'ignorez pas les valeurs NULL. Les valeurs NULL sont traitées comme la valeur minimale lors du tri. Calculez le centile exact dans une fenêtre.
SELECT PERCENTILE_CONT(x, 0, false) OVER() AS min, PERCENTILE_CONT(x, 0.01, false) OVER() AS percentile1, PERCENTILE_CONT(x, 0.5, false) OVER() AS median, PERCENTILE_CONT(x, 0.9, false) OVER() AS percentile90, PERCENTILE_CONT(x, 1, false) OVER() AS max FROM VALUES(0D),(3D),(NULL),(1D),(2D) AS tbl(x) LIMIT 1; -- Return result +------------+-------------+------------+--------------+------------+ | min | percentile1 | median | percentile90 | max | +------------+-------------+------------+--------------+------------+ | NULL | 0.0 | 1.0 | 2.6 | 3.0 | +------------+-------------+------------+--------------+------------+
-
PERCENTILE_DISC
-
Syntaxe
-- Calculate a given percentile value PERCENTILE_DISC(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) -- Calculate the percentile value in a window PERCENTILE_DISC(<col_name>, DOUBLE <percentile>[, BOOLEAN <isIgnoreNull>]) OVER ([partition_clause] [orderby_clause]) -
Description
Calcule une valeur de centile donnée. Cette fonction trie d'abord la colonne spécifiée par ordre croissant, puis renvoie la première valeur dont la distribution cumulative est supérieure ou égale au centile spécifié.
-
Paramètres
col_name : obligatoire. Colonne dotée de tout type de données triable.
percentile : obligatoire. Centile à calculer. Constante DOUBLE comprise dans l'intervalle [0, 1].
isIgnoreNull : facultatif. Indique s'il faut ignorer les valeurs NULL. Constante BOOLEAN. La valeur par défaut est TRUE. Si elle est définie sur FALSE, les valeurs NULL sont traitées comme la valeur minimale lors du tri.
partition_clause et orderby_clause : pour plus d'informations, consultez windowing_definition.
-
Valeur de retour
Renvoie la valeur du centile calculée. Le type de données est identique à celui de la colonne d'entrée col_name.
-
Exemples
-
Exemple 1 : ignorez les valeurs NULL et calculez la valeur du centile dans une fenêtre.
SELECT x, PERCENTILE_DISC(x, 0) OVER() AS min, PERCENTILE_DISC(x, 0.5) OVER() AS median, PERCENTILE_DISC(x, 1) OVER() AS max FROM VALUES('c'),(NULL),('b'),('a') AS tbl(x); -- Return result +------------+------------+------------+------------+ | x | min | median | max | +------------+------------+------------+------------+ | c | a | b | c | | NULL | a | b | c | | b | a | b | c | | a | a | b | c | +------------+------------+------------+------------+ -
Exemple 2 : n'ignorez pas les valeurs NULL. Les valeurs NULL sont traitées comme la valeur minimale lors du tri. Calculez la valeur du centile dans une fenêtre.
SELECT x, PERCENTILE_DISC(x, 0, false) OVER() AS min, PERCENTILE_DISC(x, 0.5, false) OVER() AS median, PERCENTILE_DISC(x, 1, false) OVER() AS max FROM VALUES('c'),(NULL),('b'),('a') AS tbl(x); -- Return result +------------+------------+------------+------------+ | x | min | median | max | +------------+------------+------------+------------+ | c | NULL | a | c | | NULL | NULL | a | c | | b | NULL | a | c | | a | NULL | a | c | +------------+------------+------------+------------+
-
RANK
-
Syntaxe
bigint rank() over ([partition_clause] [orderby_clause]) -
Description
Calcule le rang de la ligne actuelle au sein de sa partition, selon l'ordre de tri spécifié par orderby_clause. Le comptage commence à 1.
-
Paramètres
partition_clause et orderby_clause : pour plus d'informations, consultez windowing_definition.
-
Valeur de retour
Renvoie une valeur BIGINT. Les valeurs de retour peuvent être dupliquées et non consécutives. La valeur de retour spécifique correspond à la valeur
ROW_NUMBER()de la première ligne du groupe auquel appartient la ligne de données. Si aucune clause orderby_clause n'est spécifiée, toutes les lignes reçoivent un rang de 1. -
Exemple
Partitionnez par département (deptno) et classez les employés de chaque département selon leur salaire (sal) par ordre décroissant. La commande est la suivante :
select deptno, ename, sal, rank() over (partition by deptno order by sal desc) as nums from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 1 | | 10 | CLARK | 2450 | 3 | | 10 | WELAN | 2450 | 3 | | 10 | TEBAGE | 1300 | 5 | | 10 | MILLER | 1300 | 5 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 1 | | 20 | JONES | 2975 | 3 | | 20 | ADAMS | 1100 | 4 | | 20 | SMITH | 800 | 5 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 4 | | 30 | JAMES | 950 | 6 | +------------+------------+------------+------------+
ROW_NUMBER
-
Syntaxe
row_number() over([partition_clause] [orderby_clause]) -
Description
Calcule le numéro de ligne de la ligne actuelle au sein de sa partition, en commençant par 1.
-
Paramètres
Pour plus d'informations, consultez windowing_definition. La clause frame_clause n'est pas autorisée.
-
Valeur de retour
Renvoie une valeur BIGINT.
-
Exemple
Partitionnez par département (deptno) et attribuez un numéro séquentiel unique à chaque employé au sein de son département, selon le salaire (sal) par ordre décroissant. La commande est la suivante :
select deptno, ename, sal, row_number() over (partition by deptno order by sal desc) as nums from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+------------+ | deptno | ename | sal | nums | +------------+------------+------------+------------+ | 10 | JACCKA | 5000 | 1 | | 10 | KING | 5000 | 2 | | 10 | CLARK | 2450 | 3 | | 10 | WELAN | 2450 | 4 | | 10 | TEBAGE | 1300 | 5 | | 10 | MILLER | 1300 | 6 | | 20 | SCOTT | 3000 | 1 | | 20 | FORD | 3000 | 2 | | 20 | JONES | 2975 | 3 | | 20 | ADAMS | 1100 | 4 | | 20 | SMITH | 800 | 5 | | 30 | BLAKE | 2850 | 1 | | 30 | ALLEN | 1600 | 2 | | 30 | TURNER | 1500 | 3 | | 30 | MARTIN | 1250 | 4 | | 30 | WARD | 1250 | 5 | | 30 | JAMES | 950 | 6 | +------------+------------+------------+------------+
STDDEV
-
Syntaxe
double stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) decimal stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Calcule l'écart type de la population. Il s'agit d'un alias de la fonction STDDEV_POP.
-
Paramètres
-
expr : obligatoire. Expression pour laquelle calculer l'écart type de la population. Elle doit être de type DOUBLE ou DECIMAL.
Si la valeur d'entrée est de type STRING ou BIGINT, elle est implicitement convertie au type DOUBLE pour le calcul. Une erreur est renvoyée pour les autres types de données.
Si la valeur d'entrée est NULL, la ligne n'est pas incluse dans le calcul.
Si vous spécifiez le mot-clé distinct, la fonction calcule l'écart type de la population des valeurs uniques.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez windowing_definition.
-
-
Valeur de retour
La valeur de retour possède le même type de données que expr. Si toutes les valeurs de expr sont NULL, NULL est renvoyé.
-
Exemples
-
Exemple 1 : partitionnez par département (deptno), calculez l'écart type de la population du salaire (sal) et n'effectuez aucun tri. La fonction renvoie l'écart type cumulé de la population de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, stddev(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1546.1421524412158 | -- First row of the window. The value is the cumulative population standard deviation from the first to the sixth row. | 10 | 2450 | 1546.1421524412158 | -- The value is the cumulative population standard deviation from the first to the sixth row. | 10 | 5000 | 1546.1421524412158 | | 10 | 1300 | 1546.1421524412158 | | 10 | 5000 | 1546.1421524412158 | | 10 | 2450 | 1546.1421524412158 | | 20 | 3000 | 1004.7387720198718 | | 20 | 3000 | 1004.7387720198718 | | 20 | 800 | 1004.7387720198718 | | 20 | 1100 | 1004.7387720198718 | | 20 | 2975 | 1004.7387720198718 | | 30 | 1500 | 610.1001739241042 | | 30 | 950 | 610.1001739241042 | | 30 | 1600 | 610.1001739241042 | | 30 | 1250 | 610.1001739241042 | | 30 | 1250 | 610.1001739241042 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+ -
Exemple 2 : en mode non compatible avec Hive, partitionnez par département (deptno), calculez l'écart type de la population du salaire (sal) et triez les résultats. La fonction renvoie l'écart type cumulé de la population de la première ligne à la ligne actuelle de la partition actuelle (lignes ayant le même deptno). Les commandes sont les suivantes :
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, stddev(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. | 10 | 1300 | 0.0 | -- Cumulative population standard deviation from the first to the second row. | 10 | 2450 | 542.1151989096865 | -- Cumulative population standard deviation from the first to the third row. | 10 | 2450 | 575.0 | -- Cumulative population standard deviation from the first to the fourth row. | 10 | 5000 | 1351.6656391282572 | | 10 | 5000 | 1546.1421524412158 | | 20 | 800 | 0.0 | | 20 | 1100 | 150.0 | | 20 | 2975 | 962.4188277460079 | | 20 | 3000 | 1024.2947268730811 | | 20 | 3000 | 1004.7387720198718 | | 30 | 950 | 0.0 | | 30 | 1250 | 150.0 | | 30 | 1250 | 141.4213562373095 | | 30 | 1500 | 194.8557158514987 | | 30 | 1600 | 226.71568097509268 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+ -
Exemple 3 : en mode compatible avec Hive, partitionnez par département (deptno), calculez l'écart type de la population du salaire (sal) et triez les résultats. La fonction renvoie l'écart type cumulé de la population de la première ligne à la ligne ayant la même valeur que la ligne actuelle (les lignes ayant le même sal possèdent le même écart type de population). Les commandes sont les suivantes :
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, stddev(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. Since the sal of the first and second rows are the same, the population standard deviation for the first row is the cumulative population standard deviation of the first two rows. | 10 | 1300 | 0.0 | -- Cumulative population standard deviation from the first to the second row. | 10 | 2450 | 575.0 | -- Since the sal of the third and fourth rows are the same, the population standard deviation for the third row is the cumulative population standard deviation of the first four rows. | 10 | 2450 | 575.0 | -- Cumulative population standard deviation from the first to the fourth row. | 10 | 5000 | 1546.1421524412158 | | 10 | 5000 | 1546.1421524412158 | | 20 | 800 | 0.0 | | 20 | 1100 | 150.0 | | 20 | 2975 | 962.4188277460079 | | 20 | 3000 | 1004.7387720198718 | | 20 | 3000 | 1004.7387720198718 | | 30 | 950 | 0.0 | | 30 | 1250 | 141.4213562373095 | | 30 | 1250 | 141.4213562373095 | | 30 | 1500 | 194.8557158514987 | | 30 | 1600 | 226.71568097509268 | | 30 | 2850 | 610.1001739241042 | +------------+------------+------------+
-
STDDEV_SAMP
-
Syntaxe
double stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause]) decimal stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause]) -
Description
Calcule l'écart type d'un échantillon.
-
Paramètres
-
expr : obligatoire. Expression pour laquelle calculer l'écart type de l'échantillon. Elle doit être de type DOUBLE ou DECIMAL.
Si la valeur d'entrée est de type STRING ou BIGINT, elle est implicitement convertie en type DOUBLE pour le calcul. Une erreur est renvoyée pour les autres types de données.
Si la valeur d'entrée est NULL, la ligne n'est pas incluse dans le calcul.
Si vous spécifiez le mot-clé distinct, la fonction calcule l'écart type de l'échantillon des valeurs uniques.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez windowing_definition.
-
-
Valeur de retour
La valeur de retour a le même type de données que expr. Si toutes les valeurs de expr sont NULL, la fonction renvoie NULL. Si la fenêtre ne contient qu'une seule valeur non NULL pour expr, le résultat est 0.
-
Exemples
-
Exemple 1 : partitionnez par département (deptno), calculez l'écart type de l'échantillon du salaire (sal) sans tri. La fonction renvoie l'écart type cumulé de l'échantillon de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, stddev_samp(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1693.7138680032904 | -- First row of the window. The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 2450 | 1693.7138680032904 | -- The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 5000 | 1693.7138680032904 | -- The value is the cumulative sample standard deviation from the first to the sixth row. | 10 | 1300 | 1693.7138680032904 | | 10 | 5000 | 1693.7138680032904 | | 10 | 2450 | 1693.7138680032904 | | 20 | 3000 | 1123.3320969330487 | | 20 | 3000 | 1123.3320969330487 | | 20 | 800 | 1123.3320969330487 | | 20 | 1100 | 1123.3320969330487 | | 20 | 2975 | 1123.3320969330487 | | 30 | 1500 | 668.331255192114 | | 30 | 950 | 668.331255192114 | | 30 | 1600 | 668.331255192114 | | 30 | 1250 | 668.331255192114 | | 30 | 1250 | 668.331255192114 | | 30 | 2850 | 668.331255192114 | +------------+------------+------------+ -
Exemple 2 : partitionnez par département (deptno), calculez l'écart type de l'échantillon du salaire (sal) et triez les résultats. La fonction renvoie l'écart type cumulé de l'échantillon de la première ligne à la ligne actuelle de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, stddev_samp(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 0.0 | -- First row of the window. | 10 | 1300 | 0.0 | -- Cumulative sample standard deviation from the first to the second row. | 10 | 2450 | 663.9528095680697 | -- Cumulative sample standard deviation from the first to the third row. | 10 | 2450 | 663.9528095680696 | | 10 | 5000 | 1511.2081259707413 | | 10 | 5000 | 1693.7138680032904 | | 20 | 800 | 0.0 | | 20 | 1100 | 212.13203435596427 | | 20 | 2975 | 1178.7175234126282 | | 20 | 3000 | 1182.7536725793752 | | 20 | 3000 | 1123.3320969330487 | | 30 | 950 | 0.0 | | 30 | 1250 | 212.13203435596427 | | 30 | 1250 | 173.20508075688772 | | 30 | 1500 | 225.0 | | 30 | 1600 | 253.4758371127315 | | 30 | 2850 | 668.331255192114 | +------------+------------+------------+
-
SUM
-
Syntaxe
sum([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause]) -
Description
Renvoie la somme de expr dans une fenêtre.
-
Paramètres
-
expr : obligatoire. Colonne pour laquelle calculer la somme. Elle doit être de type DOUBLE, DECIMAL ou BIGINT.
Si la valeur d'entrée est de type STRING, elle est implicitement convertie en type DOUBLE pour le calcul. Une erreur est renvoyée pour les autres types de données.
Si la valeur d'entrée est NULL, la ligne n'est pas incluse dans le calcul.
Si vous spécifiez le mot-clé distinct, la fonction calcule la somme des valeurs uniques.
partition_clause, orderby_clause et frame_clause : pour plus d'informations, consultez windowing_definition.
-
-
Valeur de retour
Si la valeur d'entrée est de type BIGINT, une valeur BIGINT est renvoyée.
Si la valeur d'entrée est de type DECIMAL, une valeur DECIMAL est renvoyée.
Si la valeur d'entrée est de type DOUBLE ou STRING, une valeur DOUBLE est renvoyée.
Si toutes les valeurs d'entrée sont NULL, la fonction renvoie NULL.
-
Exemples
-
Exemple 1 : partitionnez par département (deptno), calculez la somme du salaire (sal) sans tri. La fonction renvoie la somme cumulée de la partition actuelle (lignes ayant le même deptno). La commande est la suivante :
select deptno, sal, sum(sal) over (partition by deptno) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 17500 | -- First row of the window. The value is the cumulative sum from the first to the sixth row. | 10 | 2450 | 17500 | -- The value is the cumulative sum from the first to the sixth row. | 10 | 5000 | 17500 | -- The value is the cumulative sum from the first to the sixth row. | 10 | 1300 | 17500 | | 10 | 5000 | 17500 | | 10 | 2450 | 17500 | | 20 | 3000 | 10875 | | 20 | 3000 | 10875 | | 20 | 800 | 10875 | | 20 | 1100 | 10875 | | 20 | 2975 | 10875 | | 30 | 1500 | 9400 | | 30 | 950 | 9400 | | 30 | 1600 | 9400 | | 30 | 1250 | 9400 | | 30 | 1250 | 9400 | | 30 | 2850 | 9400 | +------------+------------+------------+ -
Exemple 2 : en mode non compatible Hive, partitionnez par département (deptno), calculez la somme du salaire (sal) et triez les résultats. La fonction renvoie la somme cumulée de la première ligne à la ligne actuelle de la partition actuelle (lignes ayant le même deptno). Les commandes sont les suivantes :
-- Disable Hive compatible mode. set odps.sql.hive.compatible=false; -- Execute the following SQL command. select deptno, sal, sum(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 1300 | -- First row of the window. | 10 | 1300 | 2600 | -- Cumulative sum from the first to the second row. | 10 | 2450 | 5050 | -- Cumulative sum from the first to the third row. | 10 | 2450 | 7500 | | 10 | 5000 | 12500 | | 10 | 5000 | 17500 | | 20 | 800 | 800 | | 20 | 1100 | 1900 | | 20 | 2975 | 4875 | | 20 | 3000 | 7875 | | 20 | 3000 | 10875 | | 30 | 950 | 950 | | 30 | 1250 | 2200 | | 30 | 1250 | 3450 | | 30 | 1500 | 4950 | | 30 | 1600 | 6550 | | 30 | 2850 | 9400 | +------------+------------+------------+ -
Exemple 3 : en mode compatible Hive, partitionnez par département (deptno), calculez la somme du salaire (sal) et triez les résultats. La fonction renvoie la somme cumulée de la première ligne à la ligne ayant la même valeur que la ligne actuelle (les lignes ayant le même sal ont la même somme). Les commandes sont les suivantes :
-- Enable Hive compatible mode. set odps.sql.hive.compatible=true; -- Execute the following SQL command. select deptno, sal, sum(sal) over (partition by deptno order by sal) from emp;Le résultat suivant est renvoyé :
+------------+------------+------------+ | deptno | sal | _c2 | +------------+------------+------------+ | 10 | 1300 | 2600 | -- First row of the window. Since the sal of the first and second rows are the same, the sum for the first row is the cumulative sum of the first two rows. | 10 | 1300 | 2600 | -- Cumulative sum from the first to the second row. | 10 | 2450 | 7500 | -- Since the sal of the third and fourth rows are the same, the sum for the third row is the cumulative sum of the firstfour rows. | 10 | 5000 | 17500 | | 10 | 5000 | 17500 | | 20 | 800 | 800 | | 20 | 1100 | 1900 | | 20 | 2975 | 4875 | | 20 | 3000 | 10875 | | 20 | 3000 | 10875 | | 30 | 950 | 950 | | 30 | 1250 | 3450 | | 30 | 1250 | 3450 | | 30 | 1500 | 4950 | | 30 | 1600 | 6550 | | 30 | 2850 | 9400 | +------------+------------+------------+
-
Références
Si les fonctions intégrées ne répondent pas à vos besoins, vous pouvez créer des fonctions définies par l'utilisateur. Vue d'ensemble des UDF MaxCompute.
-
Problèmes courants liés au langage SQL MaxCompute :
-
Codes d'erreur courants pour les fonctions intégrées :