こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WHERE句内で「値=最大値」を取得する方法

どのようなSQLを書けばよいのかわからないので質問させてください。
以下、MasterテーブルとDataテーブルがあります。
MasterテーブルとDataテーブルのレコードを結合して取得したいと思っています。
ただし、Dataテーブルのレコードはkey1,key2,key3でグループ化した中で最新の日付の
レコードと結合したいと思っています。
以下のような取得結果を想定しているのですがどのようなSQLを書けばよろしいでしょうか。

ちなみに
SELECT m.key1, m.key2, m.key3, m.type, m.name, d.date, d.value FROM test.master m, test.data d;
where m.key1 = d.key1 and m.key2 = d.key2 and m.key3 = d.key3
and d.date = (select Max(date) from data group by key1, key2, key3)
というSQLではエラーになってしまいました。


【取得結果】
key1 key2 key3 type  name      date         value
-------------------------------------------------------------------------------------------------------------
 1  2   3  11   name1  2016-12-17 12:00:00    30
 4  5   6  22   name2  2016-12-18 12:00:00    30
 7  8   9  33   name3  2016-12-19 12:00:00    30

両者とも主キーはkey1,key2,key3となります。
【Master】
key1 key2 key3 type  name
------------------------------------------------------------
 1  2   3  11   name1
 4  5   6  22   name2
 7  8   9  33   name3


【Data】
key1 key2 key3      date       value
---------------------------------------------------------------------------------
 1  2   3   2016-12-17 10:00:00    10
 1  2   3   2016-12-17 11:00:00    20
 1  2   3   2016-12-17 12:00:00    30
 4  5   6   2016-12-18 10:00:00    10
 4  5   6   2016-12-18 11:00:00    20
 4  5   6   2016-12-18 12:00:00    30
 7  8   9   2016-12-19 10:00:00    10
 7  8   9   2016-12-19 11:00:00    20
 7  8   9   2016-12-19 12:00:00    30

投稿日時 - 2016-12-18 12:16:58

QNo.9269770

すぐに回答ほしいです

質問者が選んだベストアンサー

そういう時にはIN句を使います。

SELECT key1, key2, key3, date, value FROM data
where (key1, key2, key3, date) in
(select key1, key2, key3, Max(date) from data group by key1, key2, key3)

あとごちゃごちゃして分かりにくくなるので、単純に情報を付加するだけのテーブルは、絞り込み条件の部分が完成してから追加したほうがいいですよ。

投稿日時 - 2016-12-18 13:17:38

補足

御回答ありがとうございます。
Inに複数のカラムが指定できるとは知りませんでした。
教えて頂いたSQLを基に以下のように書いて見たところ想定した
結果を得ることができました。ありがとうございました。
SELECT m.key1, m.key2, m.key3, d.date, d.value
FROM master m, data d
where (m.key1, m.key2, m.key3, d.date) in
(select key1, key2, key3, Max(date) from data group by key1, key2, key3);

投稿日時 - 2016-12-18 13:50:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問