Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :
Databricks SQL
Databricks Runtime
Spécifie un sous-ensemble coulissant de lignes dans la partition, sur lequel opère la fonction de fenêtre d’agrégation ou analytique.
Syntaxe
{ frame_mode frame_start |
frame_mode BETWEEN frame_start AND frame_end } }
frame_mode
{ RANGE | ROWS }
frame_start
{ UNBOUNDED PRECEDING |
offset_start PRECEDING |
CURRENT ROW |
offset_start FOLLOWING }
frame_end
{ offset_stop PRECEDING |
CURRENT ROW |
offset_stop FOLLOWING |
UNBOUNDED FOLLOWING }
Paramètres
frame_mode
ROWS
Si spécifié, le cadre de fenêtre coulissante est exprimé en termes de lignes qui précèdent ou suivent la ligne active.
RANGE
Si elle est spécifiée, la fonction de fenêtre doit spécifier une clause ORDER BY avec une seule expression
obExpr.Les limites de la fenêtre coulissante sont ensuite exprimées en tant que décalage par rapport à
obExprpour la ligne active.
frame_start
Position de début du cadre de fenêtre coulissante par rapport à la ligne active.
PRÉCÉDÉ ILLIMITÉ
Spécifie que le cadre de fenêtre commence au début de la partition.
offset_start PRÉCÉDENT
Si le mode est
ROWS,offset_startest le nombre littéral intégral positif qui définit le nombre de lignes avant la ligne active où le cadre commence.Si le mode est
RANGE,offset_startest une valeur littérale positive d’un type qui peut être soustrait deobExpr. Le cadre commence à la première ligne de la partition pour laquelle la valeurobExprest supérieure ou égale àobExpr - offset_startau niveau de la ligne actuelle.RANGÉE ACTUELLE
Spécifie que le cadre commence à la ligne active.
offset_start SUIVANT
Si le mode est
ROWS,offset_startest le nombre littéral intégral positif qui définit le nombre de lignes après la ligne active où le cadre commence. Si le mode estRANGE,offset_startest une valeur littérale positive d’un type qui peut être additionné àobExpr. Le cadre commence à la première ligne de la partition pour laquelle la valeurobExprest supérieure ou égale àobExpr + offset_startau niveau de la ligne actuelle.
frame_stop
Position de fin du cadre de fenêtre coulissante par rapport à la ligne active.
Si elle n’est pas spécifiée, le cadre s’arrête à la ligne active (CURRENT ROW). La fin de la fenêtre coulissante doit être supérieure à son début.
offset_stop PRÉCÉDENT
Si frame_mode est
ROWS,offset_stopest le nombre littéral intégral positif qui définit le nombre de lignes avant la ligne active où le cadre s’arrête. Si frame_mode estRANGE,offset_stopest une valeur littérale positive du même type queoffset_start. Le cadre finit à la dernière ligne de la partition pour laquelle la valeurobExprest inférieure ou égale àobExpr - offset_stopau niveau de la ligne active.RANGÉE ACTUELLE
Spécifie que le cadre s’arrête à la ligne active.
offset_stop SUIVANT
Si frame_mode est
ROWS,offset_stopest le nombre littéral intégral positif qui définit le nombre de lignes après la ligne active où le cadre finit. Si frame_mode estRANGE,offset_stopest une valeur littérale positive du même type queoffset_start. Le cadre finit à la dernière ligne de la partition pour laquelle la valeurobExprest inférieure ou égale àobExpr + offset_stopau niveau de la ligne active.SUIVI ILLIMITÉ
Spécifie que le cadre de fenêtre s’arrête à la fin de la partition.
Exemples
> CREATE TABLE employees
(name STRING, dept STRING, salary INT, age INT);
> INSERT INTO employees
VALUES ('Lisa', 'Sales', 10000, 35),
('Evan', 'Sales', 32000, 38),
('Fred', 'Engineering', 21000, 28),
('Alex', 'Sales', 30000, 33),
('Tom', 'Engineering', 23000, 33),
('Jane', 'Marketing', 29000, 28),
('Jeff', 'Marketing', 35000, 38),
('Paul', 'Engineering', 29000, 23),
('Chloe', 'Engineering', 23000, 25);
-- ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: cumulative sum of salary within each department.
> SELECT name,
dept,
salary,
SUM(salary) OVER (PARTITION BY dept ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total
FROM employees;
Fred Engineering 21000 21000
Chloe Engineering 23000 44000
Tom Engineering 23000 67000
Paul Engineering 29000 96000
Jane Marketing 29000 29000
Jeff Marketing 35000 64000
Lisa Sales 10000 10000
Alex Sales 30000 40000
Evan Sales 32000 72000
-- ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING: moving average over three adjacent rows.
> SELECT name,
dept,
salary,
ROUND(AVG(salary) OVER (PARTITION BY dept ORDER BY salary
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)) AS moving_avg
FROM employees;
Fred Engineering 21000 22000
Chloe Engineering 23000 22333
Tom Engineering 23000 25000
Paul Engineering 29000 26000
Jane Marketing 29000 32000
Jeff Marketing 35000 32000
Lisa Sales 10000 20000
Alex Sales 30000 24000
Evan Sales 32000 31000
-- ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING: sum from the current row to the end of the partition.
> SELECT name,
dept,
salary,
SUM(salary) OVER (PARTITION BY dept ORDER BY salary
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS remaining_total
FROM employees;
Fred Engineering 21000 96000
Chloe Engineering 23000 75000
Tom Engineering 23000 52000
Paul Engineering 29000 29000
Jane Marketing 29000 64000
Jeff Marketing 35000 35000
Lisa Sales 10000 72000
Alex Sales 30000 62000
Evan Sales 32000 32000
-- RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: cumulative sum using value-based range.
-- Unlike ROWS mode, RANGE groups rows with equal `ORDER BY` values together.
> SELECT name,
dept,
salary,
SUM(salary) OVER (PARTITION BY dept ORDER BY salary
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM employees;
Fred Engineering 21000 21000
Chloe Engineering 23000 67000
Tom Engineering 23000 67000
Paul Engineering 29000 96000
Jane Marketing 29000 29000
Jeff Marketing 35000 64000
Lisa Sales 10000 10000
Alex Sales 30000 40000
Evan Sales 32000 72000
-- RANGE BETWEEN 5000 PRECEDING AND 5000 FOLLOWING: sum of salaries within +/- 5000 of the current row's salary.
> SELECT name,
dept,
salary,
SUM(salary) OVER (PARTITION BY dept ORDER BY salary
RANGE BETWEEN 5000 PRECEDING AND 5000 FOLLOWING) AS nearby_total
FROM employees;
Fred Engineering 21000 67000
Chloe Engineering 23000 67000
Tom Engineering 23000 67000
Paul Engineering 29000 75000
Jane Marketing 29000 64000
Jeff Marketing 35000 35000
Lisa Sales 10000 10000
Alex Sales 30000 92000
Evan Sales 32000 62000
-- Comparing ROWS vs RANGE: the difference is visible when there are duplicate `ORDER BY` values.
-- With ROWS, `Chloe` and `Tom` have different running totals because each row is counted individually.
-- With RANGE, `Chloe` and `Tom` have the same total because they share the same salary value.
> SELECT name,
salary,
SUM(salary) OVER (ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
SUM(salary) OVER (ORDER BY salary
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM employees
WHERE dept = 'Engineering';
Fred 21000 21000 21000
Chloe 23000 44000 67000
Tom 23000 67000 67000
Paul 29000 96000 96000