Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:
Databricks SQL
Databricks Runtime
Określa przesuwany podzbiór wierszy w partycji, na której działa funkcja agregacji lub okna analitycznego.
Składnia
{ 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 }
Parametry
frame_mode
WIERSZE
Jeśli zostanie określona, ramka przesuwnego okna jest wyrażona w odniesieniu do wierszy poprzedzających lub następujących po bieżącym wierszu.
ZAKRES
Jeśli zostanie określona, funkcja okna musi określić klauzulę ORDER BY z pojedynczym wyrażeniem
obExpr.Granice okna przesuwanego są następnie wyrażane jako przesunięcie od
obExprdla bieżącego wiersza.
frame_start
Pozycja początkowa przesuwanej ramki okna względem bieżącego wiersza.
NIEZWIĄZANE POPRZEDNIE
Określa, że ramka okna rozpoczyna się na początku partycji.
offset_start POPRZEDZAJĄCY
Jeśli tryb to
ROWS, tooffset_startjest dodatnią całkowitą liczbą wskazującą, ile wierszy przed bieżącym wierszem rozpoczyna się ramka.Jeśli tryb to
RANGE,offset_startjest dodatnią wartością literału typu, który można odjąć odobExpr. Ramka rozpoczyna się od pierwszego wiersza partycji, dla którejobExprjest większe lub równeobExpr - offset_startw bieżącym wierszu.BIEŻĄCY WIERSZ
Określa, że bieżący wiersz jest miejscem rozpoczęcia ramki.
offset_start NASTĘPUJĄCE
Jeśli tryb to
ROWS,offset_startjest dodatnią liczbą całkowitą określającą, o ile wierszy wstecz od bieżącego wiersza rozpoczyna się ramka. Jeśli tryb toRANGE,offset_startjest dodatnią wartością literału typu, który można dodać doobExpr. Ramka rozpoczyna się od pierwszego wiersza partycji, dla którejobExprjest większe lub równeobExpr + offset_startw bieżącym wierszu.
frame_stop
Koniec ramy przesuwnego okna względem bieżącego rzędu.
Jeśli nie zostanie to określone, ramka zatrzyma się na wysokości bieżącego wiersza. Koniec okna przesuwanego musi być większy niż początek ramy okna.
offset_stop POPRZEDNIE
Jeśli frame_mode to
ROWS,offset_stopjest dodatnią liczbą całkowitą definiującą, na ilu wierszach przed bieżącym wierszem ramka zatrzymuje się. Jeśli frame_mode toRANGE,offset_stopjest dodatnią wartością literału tego samego typu cooffset_start. Ramka kończy się na ostatnim wierszu partycji, dla którejobExprjest mniejszy lub równyobExpr - offset_stopw bieżącym wierszu.BIEŻĄCY WIERSZ
Określa, że ramka zatrzymuje się w bieżącym wierszu.
offset_stop NASTĘPUJĄCE
Jeśli frame_mode to
ROWS,offset_stopjest dodatnią liczbą literału całkowitego definiującą liczbę wierszy wklejanych do bieżącego wiersza, na których kończy się ramka. Jeśli frame_mode toRANGE,offset_stopjest dodatnią wartością literału tego samego typu cooffset_start. Ramka kończy się ostatnim wierszem partycji, dla którejobExprjest mniejsza lub równaobExpr + offset_stopw bieżącym wierszu.NIEZWIĄZANE Z NASTĘPUJĄCYMI
Określa, że ramka okna zatrzymuje się na końcu partycji.
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