製品アップデート
製品お知らせ
SELECT<WindowFunction> OVER (PARTITION BY <expr_list> ORDER BY <expr_list> [ASC / DESC] [<WindowFrame>])FROMtb_test_window;
select studentid,departmentid,classid,math,row_number() over(partition by departmentid,classid order by math) as row_numfrom student_scores;
Frame | ROWSシナリオ | RANGE シナリオ |
CURRENT ROW | カレント行。 | カレント行と同じすべての行。 |
UNBOUNDED PRECEDING | 先頭行まで。 | 先頭行まで。 |
UNBOUNDED FOLLOWING | 最終行まで。 | 最終行まで。 |
<N> PRECEDING | 前N行。 | OrderBy列の値から<N>を引いた値以上である行まで。 |
<N> FOLLOWING | 次のN行。 | OrderBy列の値に<N>を足した値以下である行まで。 |
関数名称 | 機能説明 | 関数引数 | サポートタイプ |
ROW_NUMBER() | 各パーティション内のデータに行番号を付与します。 | - | - |
RANK() | 各パーティション内のデータに対して非密集型ソートを実行します。 | - | - |
DENSE_RANK() | 各パーティション内のデータに対してデータ集約型ソートを実行します。 | - | - |
LEAD(<expr>、<offset>、<default>) | 現在の行から<offset>行後ろの値を算出し、該当する行がない場合は<default>を返します。 | [必須] <expr>:計算列。 | すべてのタイプ(三つのパラメータのうちTimeタイプを除く)。 |
| | [オプション] <offset>:現在の行から後方へのオフセット行数。デフォルトは1です。 | 数値型。 |
| | [オプション] <default>:計算行が満たされない場合のデフォルト戻り値。デフォルトはNULLを返します。 | <expr>タイプと同じです。 |
LAG(<expr>、<offset>、<default>) | 現在の行から<offset>行前方の値を算出し、該当する行がない場合は<default>を返します。 | [必須] <expr>:計算列。 | すべてのタイプ(三つのパラメータのうちTimeタイプを除く)。 |
| | [オプション] <offset>:現在の行から前方へのオフセット行数。デフォルトは1です。 | 数値型。 |
| | [オプション] <default>:計算行が満たされない場合のデフォルト戻り値。デフォルトはNULLを返します。 | <expr>タイプと同じです。 |
FIRST_VALUE(<expr>) | パーティションウィンドウ内の最初の値を計算します。 | [必須] <expr>:計算列。 | すべてのタイプ。 |
LAST_VALUE(<expr>) | パーティションウィンドウ内の最後の値を計算します。 | [必須] <expr>:計算列。 | すべてのタイプ。 |
MIN(<expr>) | パーティションウィンドウ内でOrderBy列の最小値の行における<expr>値を計算します。 | [必須] <expr>:計算列。 | すべてのタイプ。 |
MAX(<expr>) | パーティションウィンドウ内でOrderBy列の最大値の行における<expr>値を計算します。 | [必須] <expr>:計算列。 | すべてのタイプ。 |
COUNT(<expr>) | パーティションウィンドウ内のデータの総行数を計算します。 | [必須] <expr>:計算列。 | すべてのタイプ。 |
SUM(<expr>) | パーティションウィンドウ内のデータの合計を計算します。 | [必須] <expr>:計算列。 | 数値型。 |
AVG(<expr>) | パーティションウィンドウ内のデータの平均値を計算します。 | [必須] <expr>:計算列。 | 数値型。 |
drop table if exists test.tb_window;create table test.tb_window (c1 int not null primary key, c2 int, c3 int);create table test.tb_window (c1 Int32, c2 Nullable(Int32), c3 Nullable(Int32)) engine = LibraTree order by (c1);insert into test.tb_window values (1, 1, 1), (2, 1, 1), (3, 1, 2), (4, 1, 4), (5, 1, 6), (6, 1, 6);
-- 事例文mysql> select c2, c3, COUNT(c1) over (partition by c2 order by c3 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) cn from test.tb_window;+----+----+----+| c2 | c3 | cn |+----+----+----+| 1 | 1 | 3 | -- ウィンドウ行インデックス範囲: current -> 後2行 [0 ~ 2]| 1 | 1 | 3 | -- ウィンドウ行インデックス範囲: current -> 後2行 [1 ~ 3]| 1 | 2 | 3 | -- ウィンドウ行インデックス範囲: current -> 後2行 [2 ~ 4]| 1 | 4 | 3 | -- ウィンドウ行インデックス範囲: current -> 後2行 [3 ~ 5]| 1 | 6 | 2 | -- ウィンドウ行インデックス範囲: current -> 後1行 [4 ~ 5] (後方に1行のみ存在)| 1 | 6 | 1 | -- ウィンドウ行インデックス範囲: current (後方にデータがありません)+----+----+----+6 rows in set (0.06 sec)
-- 事例文mysql> select c2, c3, COUNT(c1) over (partition by c2 order by c3 RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING) cn from test.tb_window;+----+----+----+| c2 | c3 | cn |+----+----+----+| 1 | 1 | 3 | -- ウィンドウ行インデックス範囲: カレント -> 3に対応する行インデックス間の行データ [0 ~ 2]| 1 | 1 | 3 || 1 | 2 | 2 | -- ウィンドウ行インデックス範囲: カレント -> 4に対応する行インデックス間の行データ [2 ~ 3]| 1 | 4 | 3 | -- ウィンドウ行インデックス範囲: カレント -> 6に対応する行インデックス間の行データ [3 ~ 5]| 1 | 6 | 2 | -- ウィンドウ行インデックス範囲: カレント -> 8に対応する行インデックス間の行データ [4 ~ 5]| 1 | 6 | 2 |+----+----+----+6 rows in set (0.06 sec)
-- 事例文mysql> select c2, c3, ROW_NUMBER() over (partition by c2 order by c3) rn from test.tb_window;+----+----+------+| c2 | c3 | rn |+----+----+------+| 1 | 1 | 1 || 1 | 1 | 2 || 1 | 2 | 3 || 1 | 4 | 4 || 1 | 6 | 5 || 1 | 6 | 6 |+----+----+------+6 rows in set (0.04 sec)
-- 事例文selectc2, c3,RANK() over (partition by c2 order by c3) rk,DENSE_RANK() over (partition by c2 order by c3) drkfrom test.tb_window;+------+------+------+------+| c2 | c3 | rk | drk |+------+------+------+------+| 1 | 1 | 1 | 1 || 1 | 1 | 1 | 1 || 1 | 2 | 3 | 2 || 1 | 4 | 4 | 3 || 1 | 6 | 5 | 4 || 1 | 6 | 5 | 4 |+------+------+------+------+6 rows in set (0.05 sec)
-- 事例文mysql> selectc2, c3,LEAD(c3) over (partition by c2 order by c3) ld,LAG(c3) over (partition by c2 order by c3) lgfrom test.tb_window;+------+------+------+------+| c2 | c3 | ld | lg |+------+------+------+------+| 1 | 1 | 1 | NULL || 1 | 1 | 2 | 1 || 1 | 2 | 4 | 1 || 1 | 4 | 6 | 2 || 1 | 6 | 6 | 4 || 1 | 6 | NULL | 6 |+------+------+------+------+6 rows in set (0.11 sec)
-- 事例文mysql> selectc2, c3,LEAD(c3, 2) over (partition by c2 order by c3) ld,LAG(c3, 2) over (partition by c2 order by c3) lgfrom test.tb_window;+------+------+------+------+| c2 | c3 | ld | lg |+------+------+------+------+| 1 | 1 | 2 | NULL || 1 | 1 | 4 | NULL || 1 | 2 | 6 | 1 || 1 | 4 | 6 | 1 || 1 | 6 | NULL | 2 || 1 | 6 | NULL | 4 |+------+------+------+------+6 rows in set (0.07 sec)
-- 事例文mysql> selectc2, c3,LEAD(c3, 2, 1000) over (partition by c2 order by c3) ld,LAG(c3, 2, 1000) over (partition by c2 order by c3) lgfrom test.tb_window;+------+------+------+------+| c2 | c3 | ld | lg |+------+------+------+------+| 1 | 1 | 2 | 1000 || 1 | 1 | 4 | 1000 || 1 | 2 | 6 | 1 || 1 | 4 | 6 | 1 || 1 | 6 | 1000 | 2 || 1 | 6 | 1000 | 4 |+------+------+------+------+6 rows in set (0.10 sec)
-- 事例文mysql> selectc2, c3,FIRST_VALUE(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fv,LAST_VALUE(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) lvfrom test.tb_window;+------+------+------+------+| c2 | c3 | fv | lv |+------+------+------+------+| 1 | 1 | 1 | 6 || 1 | 1 | 1 | 6 || 1 | 2 | 1 | 6 || 1 | 4 | 1 | 6 || 1 | 6 | 1 | 6 || 1 | 6 | 1 | 6 |+------+------+------+------+6 rows in set (0.07 sec)
-- 事例文mysql> selectc2, c3,MIN(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) mi,MAX(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) mafrom test.tb_window;+------+------+------+------+| c2 | c3 | mi | ma |+------+------+------+------+| 1 | 1 | 1 | 6 || 1 | 1 | 1 | 6 || 1 | 2 | 1 | 6 || 1 | 4 | 1 | 6 || 1 | 6 | 1 | 6 || 1 | 6 | 1 | 6 |+------+------+------+------+6 rows in set (0.07 sec)
-- 事例文mysql> select c2, c3, COUNT(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) c from test.tb_window;+------+------+----+| c2 | c3 | c |+------+------+----+| 1 | 1 | 6 || 1 | 1 | 6 || 1 | 2 | 6 || 1 | 4 | 6 || 1 | 6 | 6 || 1 | 6 | 6 |+------+------+----+6 rows in set (0.04 sec)
-- 事例文mysql> select c2, c3, SUM(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) s from test.tb_window;+------+------+------+| c2 | c3 | s |+------+------+------+| 1 | 1 | 20 || 1 | 1 | 20 || 1 | 2 | 20 || 1 | 4 | 20 || 1 | 6 | 20 || 1 | 6 | 20 |+------+------+------+6 rows in set (0.06 sec)
-- 事例文mysql> select c2, c3, AVG(c3) over (partition by c2 order by c3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) a from test.tb_window;+------+------+--------+| c2 | c3 | a |+------+------+--------+| 1 | 1 | 3.3333 || 1 | 1 | 3.3333 || 1 | 2 | 3.3333 || 1 | 4 | 3.3333 || 1 | 6 | 3.3333 || 1 | 6 | 3.3333 |+------+------+--------+6 rows in set (0.06 sec)
フィードバック