ウィンドウ関数
ウィンドウ関数を使用すると、ユーザーが分析的なビジネスクエリをより効率的に作成できるようになります。ウィンドウ関数はパーティションまたは結果セットの「ウィンドウ」で演算し、ウィンドウのすべての行に値を返します。それに対して、ウィンドウ関数以外は結果セットのすべての行について計算を実行します。結果の行を集計するグループ関数とは異なり、テーブル式のすべての行が保持されます。
戻り値はこのウィンドウの行セットの値を使用して計算されます。ウィンドウはテーブルの各行に、追加の属性を計算するために使用する行のセットを定義します。ウィンドウはウィンドウ仕様 (OVER 句) を使用して定義され、次の 3 つの主要な概念に基づいています。
-
ウィンドウのパーティション、列のグループを形成 (PARTITION 句)
-
ウィンドウの並び順、各パーティション内の行の順序またはシーケンスの定義 (ORDER BY 句)
-
ウィンドウのフレーム、各行に関連して定義され、行のセットをさらに制限 (ROWS 仕様)
ウィンドウ関数は、最後の ORDER BY 句を除いて、クエリで実行される最後の演算のセットです。すべての結合およびすべての WHERE、GROUP BY、および HAVING 句は、ウィンドウ関数が処理される前に完了されます。そのため、ウィンドウ関数は選択リストまたは ORDER BY 句のみに表示できます。複数のウィンドウ関数は、別のフレーム句を持つ 1 つのクエリ内で使用できます。ウィンドウ関数は、CASE などの他のスカラー式でも使用できます。
Amazon Redshift は、集計とランク付けという 2 つのタイプのウィンドウ関数をサポートします。
サポートされる集計関数は次のとおりです。
-
AVG
-
COUNT
-
CUME_DIST
-
FIRST_VALUE
-
LAG
-
LAST_VALUE
-
LEAD
-
MAX
-
MEDIAN
-
MIN
-
NTH_VALUE
-
PERCENTILE_CONT
-
PERCENTILE_DISC
-
RATIO_TO_REPORT
-
STDDEV_POP
-
STDDEV_SAMP (STDDEV のシノニム)
-
SUM
-
VAR_POP
-
VAR_SAMP (VARIANCE のシノニム)
サポートされるランク付け関数は次のとおりです。
-
DENSE_RANK
-
NTILE
-
PERCENT_RANK
-
RANK
-
ROW_NUMBER
トピック
- ウィンドウ関数の構文の概要
- ウィンドウ関数用データの一意の並び順
- ウィンドウ関数の概要の例
- AVG ウィンドウ関数
- COUNT ウィンドウ関数
- CUME_DIST ウィンドウ関数
- DENSE_RANK ウィンドウ関数
- FIRST_VALUE および LAST_VALUE ウィンドウ関数
- LAG ウィンドウ関数
- LEAD ウィンドウ関数
- LISTAGG ウィンドウ関数
- MAX ウィンドウ関数
- MEDIAN ウィンドウ関数
- MIN ウィンドウ関数
- NTH_VALUE ウィンドウ関数
- NTILE ウィンドウ関数
- PERCENT_RANK ウィンドウ関数
- PERCENTILE_CONT ウィンドウ関数
- PERCENTILE_DISC ウィンドウ関数
- RANK ウィンドウ関数
- RATIO_TO_REPORT ウィンドウ関数
- ROW_NUMBER ウィンドウ関数
- STDDEV_SAMP および STDDEV_POP ウィンドウ関数
- SUM ウィンドウ関数
- VAR_SAMP および VAR_POP ウィンドウ関数
ウィンドウ関数の概要の例
以下に、ウィンドウ関数の操作方法が記載されている概要の例を示します。また、各関数の説明とともに特定のコード例を見つけることができます。
このセクションのいくつかのウィンドウ関数の例は、以下に示すように 11 行が含まれる WINSALES という名前のテーブルを使用します。
SALESID | DATEID | SELLERID | BUYERID | QTY | QTY_SHIPPED |
---|---|---|---|---|---|
30001 | 8/2/2003 | 3 | B | 10 | 10 |
10001 | 12/24/2003 | 1 | C | 10 | 10 |
10005 | 12/24/2003 | 1 | A | 30 | |
40001 | 1/9/2004 | 4 | A | 40 | |
10006 | 1/18/2004 | 1 | C | 10 | |
20001 | 2/12/2004 | 2 | B | 20 | 20 |
40005 | 2/12/2004 | 4 | A | 10 | 10 |
20002 | 2/16/2004 | 2 | C | 20 | 20 |
30003 | 4/18/2004 | 3 | B | 15 | |
30004 | 4/18/2004 | 3 | B | 20 | |
30007 | 9/7/2004 | 3 | C | 30 |
次のスクリプトは、WINSALES テーブルの例を作成し、値を入力します。
create table winsales( salesid int, dateid date, sellerid int, buyerid char(10), qty int, qty_shipped int); insert into winsales values (30001, '8/2/2003', 3, 'b', 10, 10), (10001, '12/24/2003', 1, 'c', 10, 10), (10005, '12/24/2003', 1, 'a', 30, null), (40001, '1/9/2004', 4, 'a', 40, null), (10006, '1/18/2004', 1, 'c', 10, null), (20001, '2/12/2004', 2, 'b', 20, 20), (40005, '2/12/2004', 4, 'a', 10, 10), (20002, '2/16/2004', 2, 'c', 20, 20), (30003, '4/18/2004', 3, 'b', 15, null), (30004, '4/18/2004', 3, 'b', 20, null), (30007, '9/7/2004', 3, 'c', 30, null);