MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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()(合計値)などの集計関数でも同様の手法が使えるので、ぜひ覚えておきましょう。

  1. 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)レコードの挿入続い

  2. MySQLで列から最大値を取得する方法

    MySQLで列の最大値を取得するには?MySQLのテーブルから特定の列の最大値を取得するには、ORDER BY句とLIMIT句を組み合わせる方法が便利です。ここでは、実際にテーブルを作成し、データを挿入して、最大値を取得する手順を順番に解説します。1. テーブルを作成するまず、以下のコマンドでサンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> Value int -> ); Query OK, 0 rows affected (0.63 sec)2. レコードを挿入する次に、INSERTコ