この問題の最初の部分は、Top-N (または Groupwise-max) クエリです。通常の構文は次のとおりです。
SELECT x.*
FROM my_table x
JOIN (SELECT grouping_id, MAX(other_field) max_other_field FROM my_table GROUP BY grouping_id) y
ON y.grouping_id = x.grouping_id
AND y.max_other_field = x.other_field;
次の例を考えてみましょう (他の場所で尋ねられた質問に触発されました):
障害飛越競技イベントの結果の表があります。各馬がどの種目で最高の成績を収めたか (そしてどのような結果を達成したか) を調べたいと考えています。
SELECT * FROM events;
+----------+----------+-------+
| Event_id | Horse_id | Place |
+----------+----------+-------+
| 601 | 101 | 1 |
| 601 | 102 | 2 |
| 601 | 201 | 3 |
| 601 | 301 | 4 |
| 602 | 201 | 2 |
| 603 | 201 | 3 |
| 701 | 101 | 1 |
| 801 | 301 | 2 |
| 901 | 102 | 7 |
+----------+----------+-------+
調査の結果、馬 101 の最高の結果は、彼女が 2 つのイベントで達成した「1 位」であったことがわかります。そのため、これらの行の両方を返す必要があります。102 馬の最高成績は 2 位で、201 馬と 301 馬も同様でした。しかし、それを伝えるクエリを作成するにはどうすればよいでしょうか。方法は次のとおりです。
SELECT x.*
FROM events x
JOIN (SELECT horse_id,MIN(place) min_place FROM events GROUP BY horse_id) y
ON y.horse_id = x.horse_id AND y.min_place = x.place;
+----------+----------+-------+
| Event_id | Horse_id | Place |
+----------+----------+-------+
| 601 | 101 | 1 |
| 601 | 102 | 2 |
| 602 | 201 | 2 |
| 701 | 101 | 1 |
| 801 | 301 | 2 |
+----------+----------+-------+