Spec-Zone.ru › MySQL 8.4

14.20.4 Имена окон

Окна можно определять и давать им имена, чтобы ссылаться на них в параграфах OVER. Для этого используйте параграф WINDOW. Если он присутствует в запросе, параграф WINDOW располагается между параграфами HAVING и ORDER BY и имеет следующий синтаксис:

WINDOW window_name AS (window_spec)
    [, window_name AS (window_spec)] ...

Для каждого определения окна, window_name — это имя окна, а window_spec — тот же тип спецификации окна, что и указанный в скобках в параграфе OVER, как описано в разделе 14.20.2 «Концепции и синтаксис функций окон»:

window_spec:
    [window_name] [partition_clause] [order_clause] [frame_clause]

Параграф WINDOW полезен для запросов, в которых несколько параграфов OVER в противном случае определяли бы одно и то же окно. Вместо этого вы можете определить окно один раз, дать ему имя и ссылаться на это имя в параграфах OVER. Рассмотрим этот запрос, который определяет одно и то же окно несколько раз:

SELECT
  val,
  ROW_NUMBER() OVER (ORDER BY val) AS 'row_number',
  RANK()       OVER (ORDER BY val) AS 'rank',
  DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank'
FROM numbers;

Запрос можно упростить, используя WINDOW для определения окна один раз и ссылаясь на окно по имени в параграфах OVER:

SELECT
  val,
  ROW_NUMBER() OVER w AS 'row_number',
  RANK()       OVER w AS 'rank',
  DENSE_RANK() OVER w AS 'dense_rank'
FROM numbers
WINDOW w AS (ORDER BY val);

Именованное окно также упрощает экспериментирование с определением окна, чтобы увидеть его влияние на результаты запроса. Вам нужно изменить только определение окна в параграфе WINDOW, а не несколько определений параграфов OVER.

Если параграф OVER использует OVER (window_name ...) вместо OVER window_name, именованное окно можно изменить путем добавления других параграфов. Например, этот запрос определяет окно, включающее разбиение, и использует ORDER BY в параграфах OVER для изменения окна различными способами:

SELECT
  DISTINCT year, country,
  FIRST_VALUE(year) OVER (w ORDER BY year ASC) AS first,
  FIRST_VALUE(year) OVER (w ORDER BY year DESC) AS last
FROM sales
WINDOW w AS (PARTITION BY country);

Параграф OVER может добавлять свойства к именованному окну, но не изменять их. Если определение именованного окна включает свойство разбиения, упорядочения или фрейминга, параграф OVER, который ссылается на имя окна, не может также включать тот же тип свойства, иначе произойдет ошибка:

  • Этот конструкт разрешен, потому что определение окна и ссылающийся на него параграф OVER не содержат одинакового типа свойств:

    OVER (w ORDER BY country)
    ... WINDOW w AS (PARTITION BY country)
    
  • Этот конструкт не разрешен, потому что параграф OVER указывает PARTITION BY для именованного окна, которое уже имеет PARTITION BY:

    OVER (w PARTITION BY year)
    ... WINDOW w AS (PARTITION BY country)
    

Определение именованного окна само по себе может начинаться с window_name. В таких случаях разрешены ссылки вперед и назад, но не циклы:

  • Это разрешено; оно содержит ссылки вперед и назад, но не циклы:

    WINDOW w1 AS (w2), w2 AS (), w3 AS (w1)
    
  • Это не разрешено, потому что содержит цикл:

    WINDOW w1 AS (w2), w2 AS (w3), w3 AS (w1)
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/window-functions-named-windows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API