Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:
Databricks SQL
Databricks Runtime
Especifica um subconjunto deslizante de linhas dentro da partição na qual a função de janela agregada ou analítica opera.
Sintaxe
{ 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 }
Parâmetros
frame_mode
LINHAS
Se especificado, a moldura da janela deslizante é expressa em termos de linhas anteriores ou posteriores à linha atual.
GAMA
Se for especificado, a função de janela deve especificar uma cláusula ORDER BY com uma única expressão
obExpr.Os limites da janela deslizante são então expressos como um deslocamento a partir da
obExprna linha atual.
frame_start
A posição inicial da moldura da janela deslizante em relação à linha atual.
PRECEDENTE ILIMITADO
Especifica que a moldura da janela começa desde o início da partição.
offset_start PRECEDENTES
Se o modo for
ROWS,offset_starté o número literal integral positivo que define quantas linhas antes da linha atual o quadro inicia.Se o modo for
RANGE,offset_starté um valor literal positivo de um tipo que pode ser subtraído doobExpr. A moldura começa na primeira linha da partição para a qualobExpré maior ou igual aoobExpr - offset_startna linha atual.LINHA ATUAL
Especifica que o quadro começa na linha atual.
offset_start SEGUINTE
Se o modo for
ROWS,offset_starté o número literal inteiro positivo que define quantas linhas além da linha atual o quadro começa. Se o modo forRANGE,offset_starté um valor literal positivo de um tipo que pode ser adicionado aoobExpr. A moldura começa na primeira linha da partição para a qualobExpré maior ou igual aoobExpr + offset_startna linha atual.
frame_stop
A extremidade da moldura da janela deslizante em relação à linha atual.
Se não for especificado, o quadro para na LINHA ATUAL. A extremidade da janela de correr deve ser maior do que o início da moldura da janela.
offset_stop ANTECEDENTES
Caso o frame_mode seja
ROWS,offset_stoprepresenta o número literal inteiro positivo que define quantas linhas antes da linha atual o quadro termina. Se frame_mode for igual aRANGE,offset_stopé um valor literal positivo do mesmo tipo queoffset_start. O quadro termina na última linha da partição para a qualobExpré menor ou igual aobExpr - offset_stopna linha atual.LINHA ATUAL
Especifica que o quadro para na linha atual.
offset_stop SEGUINDO
Se frame_mode for
ROWS,offset_stopé o número literal integral positivo que define quantas linhas após a linha atual o quadro termina. Se frame_mode for igual aRANGE,offset_stopé um valor literal positivo do mesmo tipo queoffset_start. O quadro termina na última linha da partição para a qualobExpré menor ou igual aobExpr + offset_stopna linha atual.ACOMPANHAMENTO SEM LIMITES
Especifica que o quadro da janela para no final da partição.
Exemplos
> 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