Window関数

Window関数は、クエリ結果の行を対象に計算を行います。これらは、HAVING句の後で実行されますが、ORDER BY句の前で実行されます。Window関数を呼び出すには、特殊な構文を使用してOVER句を使い、ウィンドウを指定する必要があります。例えば、次のクエリは各店員ごとの注文を価格でランク付けします。

SELECT orderkey, clerk, totalprice,
       rank() OVER (PARTITION BY clerk
                    ORDER BY totalprice DESC) AS rnk
FROM orders
ORDER BY clerk, rnk

ウィンドウは、次の2つの方法で指定できます(window_clauseを参照):

  1. WINDOW句で定義された名前付きウィンドウ仕様への参照
  2. インラインウィンドウ仕様によって、ウィンドウの構成要素を定義し、WINDOW句で事前定義されたウィンドウ構成要素を参照することができます。

集約関数

すべての集約関数は、OVER句を追加することでWindow関数として使用できます。集約関数は、現在の行のウィンドウフレーム内の行ごとに計算されます。

例えば、次のクエリは、各店員ごとに日ごとの注文金額の移動合計を生成します。

SELECT clerk, orderdate, orderkey, totalprice,
       sum(totalprice) OVER (PARTITION BY clerk
                             ORDER BY orderdate) AS rolling_sum
FROM orders
ORDER BY clerk, orderdate, orderkey

ランキング関数

cume_dist()

cume_dist() → bigint

値のグループ内での累積分布を返します。結果は、ウィンドウパーティション内のウィンドウ順序付けにおいて、現在の行の前または同位の行の数をウィンドウパーティション内の総行数で割ったものです。したがって、順序付けにおけるタイ値は、同じ分布値に評価されます。

dense_rank()

dense_rank() → bigint

値のグループ内でのランクを返します。これは、ランクと似ていますが、タイ値はシーケンス内でのギャップを生じません。

ntile()

ntile(n) → bigint

各ウィンドウパーティションの行を、1からnまでの範囲のn個のバケットに分割します。バケットの値は、最大で1つの差異があります。パーティション内の行数がバケットの数で均等に割り切れない場合、余りの値は、最初のバケットから始めて、1つずつバケットに分配されます。