这个问题的第一部分是 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 的最好成绩是她在两个项目中获得的“第一”,所以我希望将这两行都返回。马 102 的最佳成绩是“第二”,马 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 |
+----------+----------+-------+