我有以下代码,我想只选择最近的记录(因此我写了max(a.fiscal_year),除了查询每个会计年度返回。我如何调整以下查询只返回最近(最高)财政年度。
SELECT count(*), b.auditor_name, c.pubco_name, max(a.fiscal_year), a.month
FROM a_fees_view a, a_auditor b, a_pubco c
WHERE a.auditor_id = b.auditor_id AND a.pubco_id = c.pubco_id
GROUP BY a.auditor_id, a.pubco_id, a.fiscal_year
ORDER BY b.auditor_name, c.pubco_name, a.fiscal_year
此外,我想从a_pubco
表中选择 ALL pubcos,而不仅仅是a_fees_view
表中也存在的那个。如何调整上面的查询以包括a_fees_view
表和a_pubco
表中的所有pubco。
答案 0 :(得分:0)
此问题的第一部分是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;
考虑以下示例(受其他地方提出的问题的启发):
我有一个showjumping事件的结果表。我想知道每匹马最擅长的事情(以及他们取得的成果)。
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 |
+----------+----------+-------+