サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

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関数」だそうです。
同価格は同順位で、重なったぶんだけ次はトンで連番は欠けるんですね。

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog