以下のようなデータがテーブル(TEST)にあった際に

Aの最大値とBの最大を取得するようなSQLを組みたいのですが
どうしたらいいでしょうか?
+------------+
|C | A | B |
+------------+
|1 |401 | 4 |
+------------+
|2 |501 | 1 |
+------------+
|3 |501 | 2 |
+------------+
|4 |401 | 3 |
+------------+
|5 |301 | 2 |
+------------+

現状は
SELECT
MAX(MAX_TEST.A) AS MAX_A_ID,
MAX(MAX_TEST.B) AS MAX_B_ID
FROM TEST MAX_TEST WHERE MAX_TEST.MAX_A_ID
IN (SELECT MAX(A) FROM TEST );

でC=3のデータを取得できているのですが他に方法はありますか?

結果は同じ結果が欲しいです。
なので、C=3のデータを取得したいです。

回答の条件
  • 1人5回まで
  • 登録:2007/11/30 21:34:40
  • 終了:2007/12/07 21:35:03

回答(2件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/11/30 22:28:10

ポイント35pt

「AとBの最大値」

ではなくて、

「Aの最大値を取得したいが、同一のデータがある場合は、Bの最大値で判断したい」

という認識でよいでしょうか?

この場合ですが、

SELECT * FROM TEST
ORDER BY A desc, B desc
LIMIT 1

はいかがでしょうか?

id:pyopyopyo No.2

pyopyopyo回答回数357ベストアンサー獲得回数882007/12/01 01:35:12

ポイント35pt

SQLは WHERE句を INNER JOIN で書き換えてみるとシンプルになる場合があります.

INNER JOINを使ったクエリは以下のようになります.

select c,a,b from test inner join (select max(a) as max from test) as x on x.max=a order by b desc limit 1;

今回の場合は,大差ないクエリになってしまいますが,INNER JOIN <-> WHERE句の書き換えは,テクニックとして覚えておくと便利だと思います.

詳細については以下のURLの第9回 SELECT文による集計から第11回 サブクエリの部分が参考になると思います.

http://homepage1.nifty.com/rucio/main/VBdotNet/Database/index_db...

また今回の場合 group by や having を使う方法はうまく行かないと思います.

理由については上記URLの第9回の「5.よくある間違い」をご覧下さい.

個人的には今回の場合はinner joinを使うよりも hopefullyさんの質問中のクエリの方が読みやすい気がします.強いて言えば以下のように order by と limit を組み合わせても書くぐらいでしょうか?

select * from  test where a in (select max(a) from test) order by b desc limit 1;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません