アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなテーブルがあるとします。
それぞれの人の最高得点であるレコードを抽出したいのですが可能でしょうか。

テーブル: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だけでこのような出力が可能かどうかもわかりません…。
テーブルの設計が悪いというのもあるのでしょうか。

どなたかご助言くだされば幸いです。

A 回答 (3件)

#1です。



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

これなんてどうでしょう。



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 );
    • good
    • 0

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!