MySQLで重複するIDごとに各列の最大値を取得する方法(GROUP BYとMAX関数の活用)
テーブル内に同じIDが複数行存在する場合、それらをグループ化して各列の最大値をまとめて取得したいケースはよくあります。このような場合には、GROUP BY句とMAX()関数を組み合わせることで簡単に実現できます。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。ここでは、学生IDと3科目の点数(Marks1〜Marks3)を格納するテーブルを例にします。
mysql> create table DemoTable1804 ( Id int, Marks1 int, Marks2 int, Marks3 int ); Query OK, 0 rows affected (0.00 sec)
テストデータの挿入
次に、INSERTコマンドを使ってレコードを挿入します。意図的に同じIDを持つ行やNULL値を含む行を登録しています。
mysql> insert into DemoTable1804 values(1,56,89,34); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1804 values(1,98,null,94); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1804 values(2,34,45,78); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1804 values(2,null,67,null); Query OK, 1 row affected (0.00 sec)
SELECT文ですべてのレコードを表示して確認してみましょう。
mysql> select * from DemoTable1804;
実行結果は以下の通りです。
+------+--------+--------+--------+ | Id | Marks1 | Marks2 | Marks3 | +------+--------+--------+--------+ | 1 | 56 | 89 | 34 | | 1 | 98 | NULL | 94 | | 2 | 34 | 45 | 78 | | 2 | NULL| 67 | NULL | +------+--------+--------+--------+ 4 rows in set (0.00 sec)
ご覧の通り、ID「1」と「2」がそれぞれ2行ずつ存在し、一部の列にはNULLが含まれています。
GROUP BYとMAX()で重複IDごとの最大値を取得
ここからが本題です。GROUP BY句でIdごとに行をまとめ、MAX()関数で各列の最大値を取得します。MAX()関数はNULL値を自動的に無視するため、NULLが混在していても正しく最大値を求められるのがポイントです。
mysql> select Id,max(Marks1),max(Marks2),max(Marks3) from DemoTable1804 group by Id;
実行すると、以下のような出力が得られます。
+------+-------------+-------------+-------------+ | Id | max(Marks1) | max(Marks2) | max(Marks3) | +------+-------------+-------------+-------------+ | 1 | 98 | 89 | 94 | | 2 | 34 | 67 | 78 | +------+-------------+-------------+-------------+ 2 rows in set (0.00 sec)
結果の解説
- ID = 1 の場合: Marks1は56と98のうち大きい方の「98」、Marks2は89とNULLのうち「89」、Marks3は34と94のうち「94」が返されています。
- ID = 2 の場合: Marks1は34とNULLのうち「34」、Marks2は45と67のうち「67」、Marks3は78とNULLのうち「78」が返されています。
このように、GROUP BY句で重複するIDを1つのグループにまとめ、MAX()関数を適用することで、複数行に分散したデータから各列の最大値を効率的に抽出できます。MIN()(最小値)やAVG()(平均値)、SUM()(合計値)などの集計関数でも同様の手法が使えるので、ぜひ覚えておきましょう。
-
MySQLで最大の累積値とその出現回数を取得するクエリの書き方
カラム同士を掛け合わせた値(累積値)の中から最大値と、その出現回数を取得したい場合は、集計関数 COUNT(*) をサブクエリと組み合わせて使用します。あわせて GROUP BY 句も活用します。テーブルの作成まず、以下のコマンドでテーブルを作成しましょう。mysql> create table demo23-> (-> id int not null auto_increment primary key,-> value1 int,-> value2 int-> );Query OK, 0 rows affected (1.65 sec)レコードの挿入続い
-
MySQLで列から最大値を取得する方法
MySQLで列の最大値を取得するには?MySQLのテーブルから特定の列の最大値を取得するには、ORDER BY句とLIMIT句を組み合わせる方法が便利です。ここでは、実際にテーブルを作成し、データを挿入して、最大値を取得する手順を順番に解説します。1. テーブルを作成するまず、以下のコマンドでサンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> Value int -> ); Query OK, 0 rows affected (0.63 sec)2. レコードを挿入する次に、INSERTコ