8. /34
Window関数の概要
8
Window関数とは
• GROUP BYを使った集計関数との違いは?
部品名 調達先名 単価
部品A B社 100
部品A A社 140
部品B B社 200
部品C A社 200
部品C B社 180
部品調達単価
GROUP BYのイメージ
部品名 単価
部品A 120
部品B 200
部品C 190
部品ごとの平均単価を集計
部品名 調達先名 単価 平均
部品A B社 100 120
部品A A社 140 120
部品B B社 200 200
部品C A社 200 190
部品C B社 180 190
GROUP BYで集約し、計算
Window関数のイメージ
SELECT
部品名, 調達先名, 単価,
AVG(単価) OVER(PARTITION BY 部品名) AS 平均
FROM
部品調達単価
部品ごとの平均単価の集計結果も取得
PARTITION BYで分割した
範囲の計算結果を取得
SELECT
部品名, AVG(単価) AS 平均
FROM
部品調達単価
GROUP BY
部品名
この分割した集合が
「Window」
9. /34
Window関数の概要
9
Window関数とは
• Window関数と同じクエリを GROUP BY で表現すると。。。
SELECT
単価.部品名, 単価.調達先名, 単価.単価, 平均単価.平均
FROM 部品調達単価 AS 単価
INNER JOIN (
SELECT
部品名, AVG(単価) AS 平均
FROM
部品調達単価
GROUP BY
部品名
) AS 平均単価
ON 単価.部品名 = 平均単価.部品名
SELECT
部品名, 調達先名, 単価,
AVG(単価) OVER(PARTITION BY 部品名) AS 平均
FROM
部品調達単価
18. /34
ROWS/RANGE
• 基本的な構文
パーテーション内の行セットをAからBの範囲内に絞ります。
現在行が最初の行の場合のROWS句で指定した範囲のイメージ
※ 前述のスライドの①②③でのイメージ
18
Window関数の基本
ROWS BETWEEN A AND B / RANGE BETWEEN A AND B
No. 営業担当 売上日 売上額
1 Suzuki 2020/10/1 120
2 Suzuki 2020/10/2 200
3 Suzuki 2020/10/5 90
4 Suzuki 2020/10/6 90
5 Suzuki 2020/10/7 110
6 Suzuki 2020/10/8 40
7 Suzuki 2020/10/9 100
・・・
現在行→
※関数を実行
している行
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW ・・・①
ROWS BETWEEN 1 PRECEDING
AND 2 FOLLOWING ・・・②
ROWS BETWEEN 1 PRECEDING
AND 1 PRECEDING ・・・③
②や③の先頭行より前が開始位置の場
合の関数の実行結果
②・・・NULLとなる
③・・・先頭行(現在行と同じ行)から2行後
の行(No.3の行)を範囲とした関数の
実行結果となる
19. /34
ROWS/RANGE
• 基本的な構文
パーテーション内の行セットをAからBの範囲内に絞ります。
現在行が2行目の場合のROWS句で指定した範囲のイメージ
※ 前述のスライドの①②③でのイメージ
19
Window関数の基本
ROWS BETWEEN A AND B / RANGE BETWEEN A AND B
No. 営業担当 売上日 売上額
1 Suzuki 2020/10/1 120
2 Suzuki 2020/10/2 200
3 Suzuki 2020/10/5 90
4 Suzuki 2020/10/6 90
5 Suzuki 2020/10/7 110
6 Suzuki 2020/10/8 40
7 Suzuki 2020/10/9 100
・・・
現在行→
※関数を実行
している行
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW ・・・①
ROWS BETWEEN 1 PRECEDING
AND 2 FOLLOWING ・・・②
ROWS BETWEEN 1 PRECEDING
AND 1 PRECEDING ・・・③
20. /34
ROWS/RANGE
• 基本的な構文
パーテーション内の行セットをAからBの範囲内に絞ります。
現在行が3行目の場合のROWS句で指定した範囲のイメージ
※ 前述のスライドの①②③でのイメージ
20
Window関数の基本
ROWS BETWEEN A AND B / RANGE BETWEEN A AND B
No. 営業担当 売上日 売上額
1 Suzuki 2020/10/1 120
2 Suzuki 2020/10/2 200
3 Suzuki 2020/10/5 90
4 Suzuki 2020/10/6 90
5 Suzuki 2020/10/7 110
6 Suzuki 2020/10/8 40
7 Suzuki 2020/10/9 100
・・・
現在行→
※関数を実行
している行
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW ・・・①
ROWS BETWEEN 1 PRECEDING
AND 2 FOLLOWING ・・・②
ROWS BETWEEN 1 PRECEDING
AND 1 PRECEDING ・・・③
21. /34
ROWS/RANGE
• 基本的な構文
パーテーション内の行セットをAからBの範囲内に絞ります。
現在行が4行目の場合のROWS句で指定した範囲のイメージ
21
Window関数の基本
ROWS BETWEEN A AND B / RANGE BETWEEN A AND B
No. 営業担当 売上日 売上額
1 Suzuki 2020/10/1 120
2 Suzuki 2020/10/2 200
3 Suzuki 2020/10/5 90
4 Suzuki 2020/10/6 90
5 Suzuki 2020/10/7 110
6 Suzuki 2020/10/8 40
7 Suzuki 2020/10/9 100
・・・
現在行→
※関数を実行
している行
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW ・・・①
ROWS BETWEEN 1 PRECEDING
AND 2 FOLLOWING ・・・②
ROWS BETWEEN 1 FOLLOWING
AND 3 FOLLOWING
ROWS BETWEEN 1 PRECEDING
AND 1 PRECEDING ・・・③