• 締切済み

あるIDごとの最高値のレコード抽出について

下記のようなテーブルがあるとします。 それぞれの人の最高得点であるレコードを抽出したいのですが可能でしょうか。 テーブル: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だけでこのような出力が可能かどうかもわかりません…。 テーブルの設計が悪いというのもあるのでしょうか。 どなたかご助言くだされば幸いです。

みんなの回答

回答No.3

#1です。 #2さんの回答を見て思い出しましたが、PostgreSQLは、サブクエリ内でlimit句を使えましたね。 もしRDBMSがPostgreSQLでなく、MySQLであったりしたら、サブクエリ内でlimit句を使えなかったと記憶していますので、念のため。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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 );

回答No.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

関連するQ&A