Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:
Databricks SQL
Databricks Runtime
Specifica un subset scorrevole di righe all'interno della partizione in cui opera la funzione finestra di aggregazione o analitica.
Sintassi
{ 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 }
Parametri
frame_mode
ROWS
Se specificato, il frame della finestra scorrevole viene espresso in termini di righe precedenti o successive alla riga corrente.
RANGE
Se è specificato, la funzione finestra deve specificare una clausola ORDER BY con una singola espressione
obExpr.I limiti della finestra scorrevole vengono quindi espressi come offset dall'oggetto
obExprper la riga corrente.
frame_start
Posizione iniziale della cornice finestra scorrevole rispetto alla riga corrente.
SENZA LIMITI PRECEDENTI
Specifica che il frame della finestra inizia all'inizio della partizione.
offset_start PRECEDENTE
Se la modalità è
ROWS,offset_startè il numero letterale integrale positivo che definisce il numero di righe prima dell'avvio della riga corrente del frame.Se la modalità è
RANGE,offset_startè un valore letterale positivo di un tipo che può essere sottratto daobExpr. Il frame inizia alla prima riga della partizione per la qualeobExprè maggiore o uguale allaobExpr - offset_startriga corrente.RIGA ATTUALE
Specifica che il frame inizia dalla riga corrente.
offset_start SEGUENTE
Se la modalità è
ROWS,offset_startè il numero letterale integrale positivo che definisce quante righe oltre la riga corrente inizia il frame. Se la modalità èRANGE,offset_startè un valore letterale positivo di un tipo che può essere aggiunto aobExpr. Il frame inizia alla prima riga della partizione per la qualeobExprè maggiore o uguale allaobExpr + offset_startriga corrente.
frame_stop
Fine della cornice della finestra scorrevole rispetto alla riga corrente.
Se non specificato, il frame si arresta in corrispondenza della RIGA CORRENTE. La fine della finestra scorrevole deve essere maggiore dell'inizio della cornice della finestra.
offset_stop PRECEDENTE
Se frame_mode è
ROWS,offset_stopè il numero intero positivo che definisce quante righe precedenti alla riga corrente il frame si ferma. Se frame_mode èRANGE,offset_stopè un valore letterale positivo dello stesso tipo dioffset_start. Il frame termina all'ultima riga dalla partizione per la qualeobExprè minore o uguale aobExpr - offset_stopnella riga corrente.RIGA ATTUALE
Specifica che il frame si arresta nella riga corrente.
offset_stop FOLLOWING
Se `frame_mode` è
ROWS,offset_stopè il numero letterale integrale positivo che definisce quante righe oltre la riga corrente terminano il frame. Se frame_mode èRANGE,offset_stopè un valore letterale positivo dello stesso tipo dioffset_start. Il frame termina all'ultima riga della partizione per la qualeobExprè minore o uguale aobExpr + offset_stopnella riga corrente.SEGUITO ILLIMITATO
Specifica che la cornice della finestra si arresta alla fine della partizione.
Examples
> 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