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
を参照):
WINDOW
句で定義された名前付きウィンドウ仕様への参照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()
→ bigint
値のグループ内での累積分布を返します。結果は、ウィンドウパーティション内のウィンドウ順序付けにおいて、現在の行の前または同位の行の数をウィンドウパーティション内の総行数で割ったものです。したがって、順序付けにおけるタイ値は、同じ分布値に評価されます。
dense_rank()
→ bigint
値のグループ内でのランクを返します。これは、ランクと似ていますが、タイ値はシーケンス内でのギャップを生じません。
ntile(n)
→ bigint
各ウィンドウパーティションの行を、1
からn
までの範囲のn
個のバケットに分割します。バケットの値は、最大で1
つの差異があります。パーティション内の行数がバケットの数で均等に割り切れない場合、余りの値は、最初のバケットから始めて、1つずつバケットに分配されます。