WHERE句内で値=最大値を取得する方法
- 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
- unko347
- お礼率44% (121/273)
- MySQL
- 回答数1
- ありがとう数0
- みんなの回答 (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) あとごちゃごちゃして分かりにくくなるので、単純に情報を付加するだけのテーブルは、絞り込み条件の部分が完成してから追加したほうがいいですよ。
関連する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 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。
- 締切済み
- Oracle
- 日付の最大値レコードを取得する方法について
お世話になります。 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 テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。
- ベストアンサー
- Oracle
- 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です。
- ベストアンサー
- PostgreSQL
- ある条件での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で取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?
- ベストアンサー
- Oracle
- 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が思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。
- ベストアンサー
- Oracle
- 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 Server
- 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では上手く行きませんでした。 よろしくお願いします。
- ベストアンサー
- Oracle
- 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としては正しいのですが・・・。
- ベストアンサー
- PostgreSQL
- 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
補足
御回答ありがとうございます。 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);