質問 |
||
| QNo.3866549 | あるIDごとの最高値のレコード抽出について | |
|---|---|---|
| 質問者:takemaru123 |
下記のようなテーブルがあるとします。 それぞれの人の最高得点であるレコードを抽出したいのですが可能でしょうか。 テーブル:result no id point date -------------------- 1 A 60 ... 2 A 70 3 B 50 4 B 90 期待出力 no id point date ------------------- 2 A 70 ... 4 B 90 自分でも色々考えたつもりですが、例えば select max(point) from result group by id; とすると 70,90 という値は抽出されますが、該当レコードの全カラムを出力させたいです。 もし同じidで同じpointのレコードがあった場合は、dateの新しいほうを優先したいです。 id,point,dateがまったく同じレコードは存在しないと仮定します。 この他にもdistinct等も考えましたが、指定したカラムが重複した場合どのレコードが選択されるかは 不定のようですので使えそうにありません。 そもそもSQLだけでこのような出力が可能かどうかもわかりません…。 テーブルの設計が悪いというのもあるのでしょうか。 どなたかご助言くだされば幸いです。 |
|
困り度:
|
||
| 質問投稿日時: 08/03/16 00:39 |
||
回答 |
|
| ANo.3 | #1です。 #2さんの回答を見て思い出しましたが、PostgreSQLは、サブクエリ内でlimit句を使えましたね。 もしRDBMSがPostgreSQLでなく、MySQLであったりしたら、サブクエリ内でlimit句を使えなかったと記憶していますので、念のため。 |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/03/19 01:28 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.2 | これなんてどうでしょう。 select a.* from tbl as a where a.no = ( select b.no from tbl as b where a.id=b.id order by point desc, "date" desc limit 1 ); |
|---|---|
| 回答者:nora1962 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/03/16 19:48 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | RDBMSは、ここのカテゴリ通りPostgreSQLなのでしょうか? <SQL例> select x.* from result as x, (select id,max("point") as max_point from result group by id) as y, (select id,"point",max("date") as max_date from result group by id,"point") as z where x.id=y.id and y.id=z.id and x."point"=max_point and max_point=z."point" and x."date"=max_date order by x.no |
|---|---|
| 回答者:chukenkenkou | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/03/16 18:13 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |