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

このQ&Aのポイント
  • SQLを使用して、MasterテーブルとDataテーブルを結合し、Dataテーブルの最新の日付のレコードと結合する方法を教えてください。
  • 以下のSQLでエラーが発生してしまいました。どのように修正すればよいでしょうか。
  • 取得結果は、key1, key2, key3, type, name, date, valueの列を含み、MasterテーブルとDataテーブルを結合しています。
回答を見る
  • ベストアンサー

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

  • MySQL
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

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

unko347
質問者

補足

御回答ありがとうございます。 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);

関連するQ&A

  • データ取得

    name*****key1****key2****date ------------------------------- AAA*******1*******1*****2003/01 BBB*******2*******2*****2002/12 AAA*******1*******2*****2003/01 BBB*******1*******2*****2002/11 BBB*******2*******2*****2002/11 AAA*******2*******2*****2003/01 AAA*******2*******2*****2002/12 ------------------------------- (※全てのフィールドが同じ情報のレコードはない) ****は意味はありません。表を見やすくするために書いただけです。 上記のテーブルから下記のデータを取得したいと 考えています。 AAA*****2002/12*****1 AAA*****2003/01*****3 BBB*****2002/11*****2 BBB*****2002/12*****1 name列とdate列の重複しないレコードの件数を取得したいのですが どのようなSQLを記述すればよろしいでしょうか?

  • SQL MIN句

    テーブルには複数の主キーがあり、そのうちの3つの主キーを元に 最も古い日付の情報を取得したいです。 同じデータが複数あるので、副問い合わせ(=)でエラーになると思ったのですが エラーにならずにすべてのデータが取得されてしまいます。 テーブル id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 2 'A' '女' 20120102 select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男'); 下記のような情報を取得するには、SQLとして間違えておりますでしょうか。 ↓ id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。

  • 日付の最大値レコードを取得する方法について

    お世話になります。 SQLで日付の最大値を取得する方法です。 テーブルのデータ内容は以下のようになっています。 | 社員番号 | 社員名 | 日付 | 順序 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 1 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/04/01 | 1 | +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 1 | +---------+-------+-----------+-----+ 取得したいレコードは、 社員ごとの最大日付の最大順序をもつレコードです。 (上記の1行目と4行目のレコードを取得したい) この場合、 下記のようなSQLを考えます。 --------------------------------- SELECT 社員番号, 社員名, 日付 FROM テーブル名 WHERE 社員番号 = 'xxx' AND 日付 = (SELECT MAX(日付) FROM テーブル名 ) AND 順序 = (SELECT MAX(順序) FROM テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。

  • 2つの列からの最大値取得

    もしかしたらすごく簡単なことかもしれませんが、 教えて下さい。 以下のテーブルから、date1もしくはdate2が最新の日付のデータを取得するSQL文の書き方がわかりません。 (以下の例では、bbbが取得したい) name date1 date2 ---- -------- ---------- aaa 20041110 (NULL) ---- -------- ---------- bbb (NULL) 20041111 ---- -------- ---------- ccc 20041109 (NULL) ---- -------- ---------- ddd (NULL) 20041109 ---- -------- ---------- # 図がずれてわかりづらいかと思いますが... date1,date2でそれぞれmaxでname取得後に比較するしかないのでしょうか? 環境は、Redhat9+Postgresql-7.3です。

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • sql文のwhere句について

    <環境>sqlserver SQLでパラメータが空白であれば全件取得、パラメータに値が設定されている場合には 条件にHITするデータを抽出したいのですが、一本のクエリで抽出することができるのでしょうか? 空白時パラメータは以下のとおり入ってきます。 @no="" …完全一致 @name="%%" …部分一致 例) SELECT * FROM テーブル WHERE (NO = @no) and ((@name IS NULL) OR (@name IS NOT NULL) AND (NAME LIKE @name)) NAMEは上記クエリにて取得できています。 NOのところはどのようにすればよいでしょうか?

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • PostgreSQLでの外部結合

    PostgreSQLでの開発をしております。 今まで、Oracle,SQLServerでしか開発経験がなく、外部結合のやりかたがピンときません。 Oracleでいう以下のSQLをPostgreで書く場合、どのように記載すればよいのでしょうか? SELECT m.no, c.value FROM main_table m, code_master c WHERE m.code = c.code(+) AND m.update_date > sysdate AND c.content_flg = "0"; main_tableのcodeがNullや、code_master.codeに対応する値がない場合でも、レコードを持ってくる。 ※Oracleなどは独自のやりかたを行っているので、Joinを使うやりかたのほうがSQLとしては正しいのですが・・・。

  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 (今朝、ここで教えて頂いたSQL文です) 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (karute_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL