| id | moge | ← カラム名です
| 01 | 002 |
| 02 | 100 |
| 03 | 010 |
| 01 | 003 |
| 02 | 102 |
| 03 | 012 |
| 01 | 001 |
| 02 | 101 |
| 03 | 011 |
に対してクエリを投げて、各idの中で一番mogeの値が大きい行を全て取得したいと考えています。つまり欲しい結果は下記になります。
| 01 | 003 |
| 02 | 102 |
| 03 | 012 |
このため下記のクエリを考えたのですが、
SELECT * FROM <table名> GROUP BY ID ORDER BY moge DESC;
これをするとORDER BYの前にGROUP BYで同一IDが纏められてしまい、正しくソートが働かないようです。
お手数ですが正しく結果を取得するためのクエリをご教授いただければ幸いです。
SELECT ID, max(moge) FROM <table名> GROUP BY ID ORDER BY ID;
でどうでしょうか。
SELECT * FROM ( SELECT * FROM <table名> GROUP BY ID ) ORDER BY moge DESC;
というように 集計したものを ソートしたらいかがでしょうか?
結局下記のようなクエリで目的が達成できました。
select * from <table名> GROUP BY id DESC ORDER BY moge DESC ;
nattowさんのご回答で質問にあった意図のクエリにはなったと思うのですが、大変申し訳ないのですがmax値が欲しいのではなく、その行にあるデータが丸々欲しかった(質問のために他の列を省いてしまったのです・・)ため、上記のようなクエリにいたしました。
皆様、ご回答いただきありがとうございました。
えっ!?それではエラーになるはずですよ
>その行にあるデータが丸々欲しかった
それくらい読み取れないで回答してる人が多いって事は嘆かわしいですね
回答投稿したら終わってたけど、サンプル付き一例残しておきます
>|sql|
CREATE TEMPORARY TABLE q1323771618(id int, moge int);
INSERT INTO q1323771618 VALUES(01 , 002)
,(02 , 100)
,(03 , 010)
,(01 , 003)
,(02 , 102)
,(03 , 012)
,(01 , 001)
,(02 , 101)
,(03 , 011);
SELECT * FROM ( SELECT * FROM q1323771618 ORDER BY id, moge DESC) a GROUP BY id;
||<
q1323771618の部分には実際に使っているテーブル名を入れます
サブクエリにはエイリアス(例ではa)を付けないとエラーになります