Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:
Databricks SQL
Databricks Runtime
Toplama veya analiz penceresi işlevinin çalıştığı bölümdeki satırların kayan bir alt kümesini belirtir.
Sözdizimi
{ 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 }
Parametreler
frame_mode
SATIRLAR
Belirtilirse, kayan pencerenin çerçevesi geçerli satırdan önceki veya sonraki satırlar şeklinde ifade edilir.
ARALIK
Belirtilirse, pencere fonksiyonu tek bir ifade
içeren bir yan tümce belirtmelidir. Daha sonra kayan pencerenin sınırları, geçerli satır için
obExpr'e göre kaydırma değeri olarak ifade ediliyor.ORDER BYyan tümcesi eksikse Azure Databricks DATATYPE_MISMATCH oluşturur. RANGE_FRAME_WITHOUT_ORDER.ORDER BYyan tümcesinde birden çok ifade varsa, Azure Databricks DATATYPE_MISMATCH oluşturur. RANGE_FRAME_MULTI_ORDER.
frame_start
Kayan pencere çerçevesinin mevcut satıra göre başlangıç konumu.
İLIŞKISIZ ÖNCE
Pencere çerçevesinin bölmenin başında başladığını belirtir.
OFFSET_START ÖNCEKİ
Eğer mod
ROWSise,offset_startçerçevenin geçerli satırdan önce başladığı kaç satır olduğunu tanımlayan pozitif tamsayı biçimindeki literaldir.Eğer mod
RANGEise,offset_starttüründen,obExpr'den çıkarılabilen pozitif bir değişmez değerdir. Çerçeve,obExpr'ın geçerli satırdaobExpr - offset_start'e eşit veya daha büyük olduğu bölümün ilk satırında başlar.GEÇERLI SATıR
Çerçevenin geçerli satırda başladığını açıkça belirtir.
offset_start TAKİP İNDE
Mod
ROWSolduğunda,offset_startkarelerin geçerli satırdan kaç satır sonrasına başladığını tanımlayan pozitif tamsayı değişmez değeridir. ModRANGEise,offset_starttürüne eklenebilenobExprpozitif bir sabit değerdir. Çerçeve,obExpr'ın geçerli satırdaobExpr + offset_start'e eşit veya daha büyük olduğu bölümün ilk satırında başlar.
frame_stop
Kayan pencere çerçevesinin mevcut satıra göre bitişi.
Belirtilmediği takdirde, çerçeve GEÇERLİ SATIR'da durur. Kayan pencerenin sonu, pencere çerçevesinin başlangıcından büyük olmalıdır.
OFFSET_STOP ÖNCEKİ
frame_mode ise
ROWS,offset_stopçerçevenin geçerli satırdan önce kaç satırda durduğunu tanımlayan bir pozitif tamsayı değişmez değeridir. frame_modeRANGEise,offset_stop,offset_startile aynı türde pozitif bir değişmez değerdir. Çerçeve,obExpr'ın geçerli satırdakiobExpr - offset_stop'e eşit veya ondan küçük olduğu bölmenin son satırında sona erer.GEÇERLI SATıR
Çerçevenin mevcut satırda durduğunu belirtir.
offset_stop TAKİP İTE
frame_mode
ROWSise,offset_stopçerçevenin geçerli satırdan itibaren kaç satır sonra sona ereceğini tanımlayan pozitif tamsayıdır. frame_modeRANGEise,offset_stop,offset_startile aynı türde pozitif bir değişmez değerdir. Çerçeve, geçerli satırdakiobExpr'ınobExpr + offset_stop'e eşit veya ondan küçük olduğu bölümün son satırında biter.İLIŞKISIZ TAKIP
Pencere çerçevesinin bölümün sonunda duracağını belirtir.
Yaygın hata koşulları
- DATATYPE_MISMATCH. RANGE_FRAME_INVALID_TYPE
- DATATYPE_MISMATCH. RANGE_FRAME_MULTI_ORDER
- DATATYPE_MISMATCH. RANGE_FRAME_WITHOUT_ORDER
- DATATYPE_MISMATCH. SPECIFIED_WINDOW_FRAME_INVALID_BOUND
- DATATYPE_MISMATCH. SPECIFIED_WINDOW_FRAME_UNACCEPTED_TYPE
- DATATYPE_MISMATCH. SPECIFIED_WINDOW_FRAME_WRONG_COMPARISON
- WINDOW_FUNCTION_AND_FRAME_MISMATCH
Örnekler
> 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
-- `RANGE` frame requires exactly one `ORDER BY` expression.
> SELECT SUM(salary) OVER (ORDER BY salary, age
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING)
FROM employees;
Error: DATATYPE_MISMATCH
-- `RANGE` frame requires an `ORDER BY` clause.
> SELECT SUM(salary) OVER (RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING)
FROM employees;
Error: DATATYPE_MISMATCH