MySQL

GROUP BYとMAX()で重複をなくしIDも取得する方法!SQL初心者の勉強

SQL

テーブル操作でIDを除いて一意の値を取得する必要がありました。
DISTINCTやGROUP BYをする時にIDを含めてしまうとIDが一意の値のため重複の削除ができず、この場合IDを取得できないのかと思っていました。
しかし、先人の方のSQLをみてみるとIDもついてました。こんなやり方でできるのかと感動したので備忘録です。

重複の件数を出す方法はこちらにまとめています。

動作環境

この記事はSQL FIDDLEでMySQL5.6、PostgreSQL9.6、SQLiteで動作確認しました。
下記文章は主にPostgreSQLで仕様で調べています。

重複をなくしIDを取得し表示する方法

GROUP BYで重複をなくし(一意)IDをつけて表示します。IDは重複のため重複の中から1つ条件にあったものを取得し表示させます。

準備

テストするテーブルの情報です。

ItemIDItemNameQuantityAREA
1プリン25大阪
2ゼリー20大阪
3ゼリー30東京
4プリン15大阪
5プリン60東京
6プリン25大阪
7ゼリー20東京
itemテーブル

上記テーブルの作成用コードです。

— CREATE文 item テーブル
CREATE TABLE item (
ItemID numeric(8, 0) unique not null,
ItemName character varying (20),
Quantity numeric(8, 0),
AREA character varying (20),
primary key(ItemID)
);
— itemテーブル用INSERT文
insert into item
values(0001, ‘プリン’, 25, ‘大阪’),
(0002, ‘ゼリー’, 20, ‘大阪’),
(0003, ‘ゼリー’, 30, ‘東京’),
(0004, ‘プリン’, 15,’大阪’),
(0005, ‘プリン’, 60, ‘東京’),
(0006, ‘プリン’, 25, ‘大阪’),
(0007, ‘ゼリー’, 20, ‘東京’);

重複をなくし(一意)IDを取得し表示するサンプルSQL

SELECT
ItemName
,AREA
,Max(ItemID) as ItemID — ItemIDの中から最大値を取得
FROM item
Group by
ItemName
,AREA
Order by
ItemID
;

MAX()でIDの中から大きい数字を取得して割り当てています。MIN()にすると小さい数字(若番)を割り当てます。

■ 結果

ItemNameAREAItemID
ゼリー大阪2
プリン東京5
プリン大阪6
ゼリー東京7

おわり

とても簡単にIDが取得できました。いくらググっても出てこないからできないのかと思いましたが考え方の問題でした。先人の書いたコードは勉強になります。

関連:Max()については以下でまとめています。

追記

PostgreSQLであればより簡単に重複をなくしIDを取得することができそうです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です