Pencere çerçevesi maddesi

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş 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 BY yan tümcesi eksikse Azure Databricks DATATYPE_MISMATCH oluşturur. RANGE_FRAME_WITHOUT_ORDER. ORDER BY yan 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 ROWS ise, 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 RANGE ise, offset_start türünden, obExpr'den çıkarılabilen pozitif bir değişmez değerdir. Çerçeve, obExpr'ın geçerli satırda obExpr - 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 ROWS olduğunda, offset_start karelerin geçerli satırdan kaç satır sonrasına başladığını tanımlayan pozitif tamsayı değişmez değeridir. Mod RANGE ise, offset_start türüne eklenebilen obExpr pozitif bir sabit değerdir. Çerçeve, obExpr'ın geçerli satırda obExpr + 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_mode RANGE ise, offset_stop, offset_start ile aynı türde pozitif bir değişmez değerdir. Çerçeve, obExpr'ın geçerli satırdaki obExpr - 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 ROWS ise, offset_stop çerçevenin geçerli satırdan itibaren kaç satır sonra sona ereceğini tanımlayan pozitif tamsayıdır. frame_mode RANGE ise, offset_stop, offset_start ile aynı türde pozitif bir değişmez değerdir. Çerçeve, geçerli satırdaki obExpr'ın obExpr + 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ı

Ö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