0

我有以下代码,我想只选择最近的记录(因此我写了 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

此外,我想从表中选择所有pubcos,a_pubco而不仅仅是表中也存在的那些a_fees_view。如何调整上面的查询以包含a_fees_view表和a_pubco表中的所有 pubco。

4

1 回答 1

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;

考虑以下示例(受其他地方提出的问题启发):

我有一个障碍赛的结果表。我想知道每匹马在哪场比赛中表现最好(以及他们取得的成绩)。

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 |
+----------+----------+-------+
于 2013-01-14T18:19:50.010 回答