MySQLの勉強:WINDOW関数
2023-11-21 記載
概要 : MySQL8.0で新規導入のWINDOW関数を学ぶ
関連記事 : MySQLの勉強:共通表形式CTE CommonTableExpression
Keyword : WINDOW関数, MySQL
書籍『MySQL徹底入門 :第4版 -MySQL 8.0対応』にて学んだこと――WINDOW関数。
以下のようなテーブルがあったとします。
社員食堂で、好きに組み合わせできる定食を想定します。
プレートに4つのくぼみがあり、主食 ・メイン皿・副菜・汁物の器がはまります。つまり区分で1つを選びます。レジで会計します。
auto_id | 区分 | 品名 | 価格 |
---|---|---|---|
1 | 主食 | 白ごはん | 200 |
2 | 汁物 | 季節の味噌汁 | 80 |
3 | 主食 | かやくご飯 | 250 |
4 | メイン皿 | ハンバーグ | 400 |
5 | メイン皿 | 焼き魚 | 300 |
6 | メイン皿 | からあげ | 350 |
7 | 副菜 | 冷奴 | 200 |
8 | 副菜 | 煮物 | 240 |
9 | 副菜 | 納豆 | 100 |
10 | 副菜 | だし巻き卵 | 130 |
13 | メイン皿 | おつくり | 400 |
14 | メイン皿 | ステーキ | 500 |
データ作成SQLはこちら。
CREATE TABLE `t_test` (
`auto_id` int(11) NOT NULL,
`区分` varchar(64) NOT NULL,
`品名` varchar(64) NOT NULL,
`価格` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
ALTER TABLE `t_test`
ADD PRIMARY KEY (`auto_id`);
INSERT INTO `t_test` (`auto_id`, `区分`, `品名`, `価格`) VALUES
(1, '主食', '白ごはん', 200),
(2, '汁物', '季節の味噌汁', 80),
(3, '主食', 'かやくご飯', 250),
(4, 'メイン皿', 'ハンバーグ', 400),
(5, 'メイン皿', '焼き魚', 300),
(6, 'メイン皿', 'からあげ', 350),
(7, '副菜', '冷奴', 200),
(8, '副菜', '煮物', 240),
(9, '副菜', '納豆', 100),
(10, '副菜', 'だし巻き卵', 130),
(13, 'メイン皿', 'おつくり', 400),
(14, 'メイン皿', 'ステーキ', 500);
「安あがりな組み合わせは?」という観点でみるとき
こういうSQLを発行できます。
select * , RANK()
over (PARTITION by 区分 ORDER by 価格) as 安い順
from t_test;
auto_id 区分 品名 価格 安い順
5 メイン皿 焼き魚 300 1
6 メイン皿 からあげ 350 2
4 メイン皿 ハンバーグ 400 3
13 メイン皿 おつくり 400 3
14 メイン皿 ステーキ 500 5
1 主食 白ごはん 200 1
3 主食 かやくご飯 250 2
9 副菜 納豆 100 1
10 副菜 だし巻き卵 130 2
7 副菜 冷奴 200 3
8 副菜 煮物 240 4
2 汁物 季節の味噌汁 80 1
WINDOW関数=「行をひとつにまとめないGroup By関数」だそうです。
同価格は同順位で、重なったぶんだけ次はトンで連番は欠けるんですね。