Developer

【SQL基礎】ウィンドウ関数とは
2021.07.31
Lv1

【SQL基礎】ウィンドウ関数とは

本項からはウィンドウ関数について説明をしていきます。


ウィンドウ関数とは

MySQL8.0から、MySQLでもウィンドウ関数が実装されました。
Oracleでは、分析関数とも呼ばれたりしています。
ウィンドウ関数とは、簡単に言うとOracleで分析関数と呼ばれている通り、SELECT句に対して分析を行うことができる関数です。
例えば、RANK関数を使用するとSELECT結果をランキングすることができます。
また、ウィンドウ関数には、例にあげたRANK関数のようなウィンドウ関数以外にも大体の集約関数を使用することができます。
集約関数をウィンドウ関数として使用した場合の動きの違いとしては、集約関数として使用した場合は集約した行が単一行にまとまりますが
ウィンドウ関数として使用した場合は、一行にはまとまらずそれぞれの行に集約結果を表示します。


ウィンドウ関数の構文

ウィンドウ関数の基本的な構文は以下になります。

1
ウィンドウ関数 OVER([PARTITION BY 列名] [ORDER BY 列名 [ASC|DESC]] [{ROWS|RANGE} フレーム指定])

PARTITION BYは、対象となる列名を指定します。省略した場合は、全体が対象となります。
ORDER BYは、パーティション内で行の処理順番をどのようにするか指定します。
ROWSやRANGEは、集約範囲を指定しています。一部のウィンドウ関数や集約関数で使用します。
フレーム指定では、開始位置のみ、または、開始位置と終了位置両方を指定できます。

例)

1
2
3
ROWS 開始位置
 
ROWS BETWEEN 開始位置 AND 終了位置

開始位置または終了位置には以下が指定できます。

CURRENT ROW 現在の行
UNBOUNDED PRECEDING パーティションの先頭
UNBOUNDED FOLLOWING パーティションの終端
数値(n) PRECEDING 現在の行からn行前
数値(n) FOLLOWING 現在の行からn行後

開始位置のみ指定した場合は、終了位置は「CURRENT ROW(現在の行)」になります。
また、ウィンドウ関数が使用できる場所は、SELECT句かGROUP BY句のみです。


ウィンドウ関数の種類

MySQLで使用できるウィンドウ関数は以下になります。
また、このほかにも前述した通り、集約関数(GROUP_CONCAT()は除く)も使用することができます。

CUME_DIST() 累積分布値
DENSE_RANK() パーティション内の現在の行のランク(ギャップなし)
FIRST_VALUE() ウィンドウフレームの最初の行からの引数の値
LAG() パーティション内の現在の行より遅れている行からの引数の値
LAST_VALUE() ウィンドウフレームの最後の行からの引数の値
LEAD() パーティション内の現在の行の先頭にある行からの引数の値
NTH_VALUE() ウィンドウフレームのN番目の行からの引数の値
NTILE() パーティション内の現在の行のバケット番号。
PERCENT_RANK() ランク値のパーセンテージ
RANK() パーティション内の現在の行のランク(ギャップあり)
ROW_NUMBER() パーティション内の現在の行の数

次項からは、ウィンドウ関数からはRANK、DENSE_RANK、ROW_NUMBER、集約関数からはSUMやAGV関数などで
実際の動きを見ていきたいと思います。


今回の学習ポイント

・MySQL8.0からウィドウ関数を使用できる。
・ウィンドウ関数とは、リアルタイムでSELECT結果を分析できる関数である
・集約関数もウィンドウ関数として使用することができる


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.次のうち間違っているものはどれか。

A)集約関数はすべてウィンドウ関数として使用することができる。
B)ウィンドウ関数は、集約関数とは違い単一行にまとめることなく複数行のデータの集約結果を各行に追加できる。
C)ウィンドウ関数はMySQL8.0以前のバージョンでは使用できない。

答え

Aの「集約関数はすべてウィンドウ関数として使用することができる。」が間違い。
GROUP_CONCAT関数は使うことができません。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ