人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

以下のようなデータがテーブル(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のデータを取得したいです。

●質問者: hopefully
●カテゴリ:就職・転職 ウェブ制作
✍キーワード:501 as MAX SELECT SQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●35ポイント

「AとBの最大値」

ではなくて、

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

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

この場合ですが、

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

はいかがでしょうか?


2 ● pyopyopyo
●35ポイント

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;
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ