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

さらに、テーブルに存在するものだけでなく、テーブルからすべてのpubcoを選択したいと思います。上記のクエリを調整して、テーブルとテーブルの両方にあるすべての pubco を含めるにはどうすればよいですか。a_pubcoa_fees_viewa_fees_viewa_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 の最高の結果は、彼女が 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 |
+----------+----------+-------+
于 2013-01-14T18:19:50.010 に答える