MySQL 8.0 は、分析関数としても知られるウィンドウ関数 (Window Function) をサポートしています。ウィンドウ関数はグループ化集計関数に似ていますが、データの行ごとに 1 つの結果を生成します。集計ウィンドウ関数: SUM /AVG / COUNT /MAX/MIN など。
ケースは次のとおりです。売上テーブルの構造とデータは次のとおりです。
共通のグループ化、集計(国別統計)
SELECT country,sum(sum)
FROM sales
GROUP BY country
order BY country;
窓口機能(国別まとめ)
select year,country,product,sum,
sum(sum) over (PARTITION by country) as country_sum
from sales
order by country,year,product,sum;
ウィンドウ関数(タイ値を計算)
select year,country,product,sum,
sum(sum) over (PARTITION by country) as country_sum,
avg(sum) over (PARTITION by country) as country_avg
from sales
order by country,year,product,sum;
専用ウィンドウ機能:
-
シリアル番号関数: ROW_NUMBER()、RANK()、DENSE_RANK()
-
分布関数: PERCENT_RANK()、CUME_DIST()
-
フロント関数とバック関数: LAG()、LEAD()
-
先頭関数と末尾関数: FIRST_VALUE()、LAST_VALUE()
-
その他の関数: NTH_VALUE()、NTILE()
窓関数(ランキング)
カテゴリの順位を計算するランキングウィンドウ関数と、指定した位置のデータを取得するバリューウィンドウ関数
SELECT
YEAR,
country,
product,
sum,
row_number() over (ORDER BY sum) AS 'rank',
rank() over (ORDER BY sum) AS 'rank_1'
FROM
sales;
SELECT
YEAR,
country,
product,
sum,
sum(sum) over (PARTITION by country order by sum rows unbounded preceding) as sum_1
FROM
sales order by country,sum;
もちろん、実行できる操作はたくさんあります。詳細については、公式 Web サイトを参照してください。
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html