【SQL】max関数で最大値のレコードを取得する方法

analystics

SQLのmax関数で最大値のレコードを取得する方法を教えます。

また最大値のレコードを取得する時のエラーになるものや注意点もお伝えします。

そのエラーの対処法なども現役エンジニアの筆者が答えていきます。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やアプリやWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

この記事を読めばSQLのmaxについて理解できます。

目次

SQLのmax関数で最大値のレコードを取得する方法

max

最大値のレコードを取得するmax関数のSQLの基礎は以下です。

select max(カラム名) where テーブル名 group by グルーピングしたいカラム名

SQLのテーブル基礎構成は以下です。

SQLのテーブル構成カラム1カラム2
レコード1レコード1の値レコード1の値
レコード2レコード2の値レコード2の値
SQLのテーブル構成

max関数の特徴として3つあります。

SQLのMAX関数の特徴3選
  • グループ内で最大値を抽出する
  • グループを指定しない場合は全体を1グループとして抽出する
  • 数字だけでなく、文字列や日付なども使用可能

maxを使用してグループ内で最大値を抽出する

max

maxを使用してグループ内で最大値を抽出してみます。

まず下のようなSQLテーブルがあるとします。テーブル名は「users」にします。

id name score group_name
1user_141B
2user_224A
3user_335B
4user_412C
5user_543A
SQLのusersテーブル

「group」カラムが同じものの中での最大値を抽出してみます。そのSQLは以下となります。

select group_name ,max(score) from users group by group_name;

このSQLを実行した結果は以下となります。

group_namemax(score)
A43
B41
C12
SQLの実行結果

AからCまでのグループの中で、scoreの最大値が表示されています。

maxを持っているレコードを表示したい時の注意点

注意
id name score group_name
1user_141B
2user_224A
3user_335B
4user_412C
5user_543A
SQLのusersテーブル

では先程の条件でレコード全体を表示してみます。SQLは以下となります。

select id,name,group_name ,max(score) from users group by group_name;

selectの後に「id」と「name」を追加しました。

実行結果は以下となりました。

id name group_name score
2user_2A43
1user_1B41
4user_4C12
SQLの実行結果

このSQLですがデーターベースの種類によってエラーが出るか、想定外のグループの最初の人が出るかになります。

「group by」でグルーピングした場合は「group by」で指定したカラムか、関数(maxやminなど)でないと思い通りに処理してくれません。

このDBではエラーが出ず結果が出ていますが、「id」と「name」に関しては正常に表示されていません。

例えばAグループの最高得点は43ですが、その方の「id」は「5」、「name」は「user_5」が正解です。しかしここでは「id」は「2」、「name」は「user_2」となっており、想定通りではありません。

「group by」でグルーピングした場合は「group by」で指定したカラム関数(maxやminなど)以外は指定しないでください。

max関数でグループを指定しない場合

グルーピング
id name score group_name
1user_141B
2user_224A
3user_335B
4user_412C
5user_543A
SQLのusersテーブル

max関数でグループを指定しない場合を試します。SQLは以下となります。

select group_name ,max(score) from users;

scoreのmax以外にgroup_nameを追加で表示させています。実行結果は以下です。

group_namemax(score)
B43
SQLの実行結果

テーブル全体で一番最大の43が表示されていますが、それに対応する「group_name」の「A」ではなく「B」が表示されています。

グループを指定しない場合はテーブルを一つのグループとして抽出するので関数(maxやmin)以外は指定しないでください。

maxで数字だけでなく、文字列や日付などの最大を抽出

日付
id name birthday score group_name
1user_11999-4-341B
2user_21996-07-1524A
3user_32001-12-0335B
4user_42006-01-0912C
5user_51998-07-0743A
SQLのusersテーブル

maxやminは数字だけではなく、日付や文字列まで優劣をつけてくれます。

ここでは日付の最大を抽出してみます。

select group_name,name,max(birthday) from users;

SQLの実行結果は以下となりました。

group_namename max(birthday)
Buser_12006-01-09
SQLの実行結果

maxで最大の「2006年1月9日」が抽出されています。

max以外の指定カラムは出鱈目(デタラメ)なので注意です。

max関数以外のレコードも全て表示する方法

id name score group_name
1user_141B
2user_224A
3user_335B
4user_412C
5user_543A
SQLのusersテーブル

maxで最大値のレコード全体を表示できないかをサブクエリで試行錯誤してみます。

SELECT * 
FROM `users` AS u 
where score 
in (select max(score) 
from `users` AS s 
where u.group_name = s.group_name)

「users」のテーブルを「u」として「score」がサブクエリの結果の範囲に入っているレコードを表示します。

サブクエリでは「users」テーブルを「s」として「u」と「s」の「group_name」が同じもののmax(最大値)を表示します。

サブクエリの最大値がscoreと同じレコードを全て表示しています。

SQLの結果は以下となりました。

id name score group_name
1user_141B
4user_412C
5user_543A
SQLのusersテーブル

グループごとのmax(最大値)が表示され、そのレコードも全て表示できました。

analystics

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次