MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  名前付きウィンドウ

12.21.4 名前付きウィンドウ

Windows を定義し、OVER 句でそれらを参照するための名前を付けることができます。 これを行うには、WINDOW 句を使用します。 クエリーに存在する場合、WINDOW 句は HAVING 句と ORDER BY 句の位置の間にあり、構文は次のとおりです:

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

各ウィンドウ定義について、セクション12.21.2「Window 関数の概念と構文」 で説明されているように、window_name はウィンドウ名で、window_specOVER 句のカッコの間に指定されているものと同じタイプのウィンドウ指定です:

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);

名前付きウィンドウを使用すると、クエリー結果への影響を確認するために、ウィンドウ定義を簡単に試すことができます。 複数の OVER 句定義ではなく、WINDOW 句のウィンドウ定義のみを変更する必要があります。

OVER 句で OVER window_name ではなく OVER (window_name ...) を使用する場合、他の句を追加して名前付きウィンドウを変更できます。 たとえば、次のクエリーはパーティション化を含むウィンドウを定義し、OVER 句で ORDER BY を使用してウィンドウを様々な方法で変更します:

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)

関連キーワード:  関数, ウィンドウ, 名前, 定義, WINDOW, 空間, window, リファレンス, 参照, ORDER