日付の最大値を検索条件にする方法

このQ&Aのポイント
  • ORACLEのMAX()関数を使用して、商品テーブルから指定した商品コードの中で最新の日付のレコードの商品コードを取得する方法を教えてください。
  • 上記のSQLサンプルでは、商品テーブルの日付項目が最新の日付のレコードのみを取得し、指定した商品コードで絞り込んでいます。
  • 他にも、日付の最大値を検索条件にする方法についてご教授いただけると幸いです。
回答を見る
  • ベストアンサー

日付の最大値を検索条件にする方法

お世話になります。 ORACLEのMAX()関数を使用して、 下記内容を取得するSQLを作成しています。 ・商品テーブルから商品コードを取得したい ・上記の取得条件として、商品テーブルの日付項目が最新日付のレコードのみを 取得したい ・上記の取得条件に加えて、指定したいくつかの商品に該当するもののみを 検索対象としたい 【SQLサンプル】 SELECT 商品コード FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' AND 日付 = (SELECT MAX(日付) FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' ) AND ランク = (SELECT MAX(ランク) FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' ) 上記以外の書き方で何か良い書き方があれば、 ご教授願えますか? よろしくお願いいたします。

  • Oracle
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

データの内容がわからないのではっきりとはいえませんが、 データの内容によっては、質問のSQLはまずいです。 商品コード,日付 101,5/5 102,5/6 103,5/4 とあると、102しかとってこないのでは? 普通は、 SELECT 商品コード FROM 商品テーブル X WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' AND 日付 = (SELECT MAX(日付) FROM 商品テーブル Y WHERE X.商品コード = Y.商品コード AND Y.在庫区分 = '0' ) とします。 で、もう1点問題があって ランク の部分です。 商品コード,日付,ランク 101,5/5,3 101,5/6,2 とあるとどちらを優先ですか? このパターンがないとして、 商品コード,日付,ランク 101,5/5,3 101,5/5,2 101,5/5,1 のようなデータが入っているので、 最大の日付を優先とすると、 AND X.ランク = (SELECT MAX(ランク) FROM 商品テーブル Z WHERE X.商品コード = Z.商品コード AND Z.在庫区分 = '0' AND Z.日付 = (SELECT MAX(日付) FROM 商品テーブル Q WHERE Q.商品コード = Z.商品コード AND Q.在庫区分 = '0' ) ) とでもしますか。 別の方法 SELECT X.商品コード FROM 商品テーブル X, ( SELECT 商品コード,MAX(日付) as 日付 FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' group by 商品コード) Y, ( SELECT 商品コード,日付,MAX(ランク) as ランク FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' group by 商品コード,日付) Z WHERE x.商品コード IN (101, 102, 103) AND x.在庫区分 = '0' AND x.商品コード = Y.商品コード AND x.日付 = Y.日付 AND x.商品コード = Z.商品コード AND Y.日付 = Z.日付 AMD x.ランク = Z.ランク という方法もあります。 (副問い合わせで抽出された結果のデータ量が多いとリソースを食うし、レスポンスは悪いですが。)

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

>・上記の取得条件として、商品テーブルの日付項目が最新日付のレコードのみを取得したい とありますが、記載のSQLは「日付が最新」かつ「ランクが最大」となっていますよね。 とりあえず、記載のSQLをベースにしました。 ORACLEのバージョンが書いていないのですが、分析関数が使える(9i?)なら。 SELECT 商品コード FROM ( SELECT 商品コード,日付,ランク ,MAX(日付) OVER() MAX日付 ,MAX(ランク) OVER() MAXランク FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0') WHERE 日付 = MAX日付 AND ランク = MAXランク; とか。

関連するQ&A

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

    お世話になります。 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 テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。

  • 日付検索で0000-00-00 00:00:00を除外したい

    日付検索で0000-00-00 00:00:00を除外したい mysql5.0 データ型はdatetimeで日付検索をしたのですが、 日付が"0000-00-00 00:00:00"で登録されているデータも 検索結果に表示され困っています。 例えば、 SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') →これだと、hizukeが0000-00-00 00:00:00のデータも表示されてしまいます。 日付が0000-00-00 00:00:00で登録されているデータを除外するため 自分もいろいろしてみたのですができません。どなたか教えていただけないでしょうか。 参考までに、自分が試したsql文を書きます。↓ SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke != '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke <> '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke not in ('0000-00-00 00:00:00')) →上記載のsqlはすべて検索件数が0になってしまいました。 もうわからなくなってしまったので、アドバイスお願いします。

    • ベストアンサー
    • MySQL
  • oracle 最新日付との比較

    いま、同一商品番号の最新日付を利用した条件が うまく作れず悩みながら色々試していますが、 うまくいきません。 やりたいことは、 1,AテーブルとBテーブルの 商品番号が同じ場合は除外します。 2,残されたデータから次はCテーブルの中にある 同一商品番号で、最新の日付が当月の場合はデータを残す。 つまり、前月以前のデータは除外となります。 1まではできています。 Select * from aテーブル where not exists (select 'X' from bテーブル where a.商品番号 = b.商品番号) この先上記sqlにつなげてmax関数くくった最新日付と システム日付を年月のみで比較する等試みましたが、 求めた結果になりません。 上記sqlでビューを作成してといったことは、 今回やらずに一つのsqlのみでできないかと 試行錯誤です。 よきアドバイスございましたら、 宜しくお願い致します。

  • あいまい検索の仕方で・・・

    SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') とサブクエリで出したいものが出ますが・・・あいまい検索にしたいと思っています。 SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%竹輪%') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%胡瓜%') AND 売上品 IN ('竹輪','胡瓜') まではわかるのですが売上品 IN ('竹輪','胡瓜')はどうすればよいのでしょうか?

  • ポスグレで指定した中で最大のレコードを1件取得する

    ポスグレで指定した中で最大のレコードを1件取得する方法を教えてください。 下記の項目を持つテーブルがあるとします。 ・部署 ・氏名 ・日付 ・連番 ・内容 KEY(部署,氏名,日付,連番) 部署と氏名を指定した中で直近のレコードを1件だけ取得したいです。 例えば select * from テーブル where 部署 = 値 and 氏名 = 値 order by 日付 desc ,連番 desc で頭の1件を抜ければよいのですが、 limit 1を指定しても、どうやらorder byより先にlimitがかかっているようで、並び替えた後の最初の1件をとれません。 また、 ソート項目が1つだけなら select * from テーブル where 部署 = 値 and 氏名 = 値 and 日付 = (select max(日付) from テーブル t1 where t1.部署 = 値 and t1.氏名 = 値) という事もできますが、 日付が最大の中での連番が最大というのはさらに一手間必要です。 何か良い方法はありませんか? 全件持ってきた後にアプリ側で最初の1件だけ使うのではなく、postgres内で1件にしてアプリ側に渡したいです。

  • SQL結合条件

    結合抽出(テーブルの表示)の方法はこのままで WHERE句にあるようなの条件を付け加え 計算も行いたいのですが、よい方法はありませんか? どなたか、ご享受ください。 SELECT MS.商品コード, MS.倉庫コード, MS.現在庫数, ISNULL(SUM(UTP.数量),0)  T売上明細ファイル1OR4, MS.現在庫数 + ISNULL(SUM(UTP.数量),0)  帳簿在庫 FROM T商品別倉庫在庫 MS LEFT JOIN T売上明細ファイル UTP ON MS.倉庫コード = UTP.倉庫コード AND MS.商品コード = UTP.商品コード --WHERE --T売上明細ファイル UTP PLUS条件 -- UTP.売上区分コード = 1 --OR --UTP.売上区分コード = 4 GROUP BY MS.商品コード, MS.倉庫コード, MS.現在庫数

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

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (food_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
  • VIEWのレスポンス改善について

    現在オラクル10gでレスポンス改善の勉強をしています。 下記のようなデータ、テーブルがあるとき有効なSQLの書き方が分かりません。 テーブル名;MASTER_CODE カラム名 ・区分コード ・コード ・レベル ・名称 サンプルデータ 区分コード、コード、レベル、名称 1000 10 1 東京本部 1000 11 1 大阪支店 1000 12 1 福岡支店 1000 10 2 営業部  1000 11 2 開発部 1000 12 2 総務部 1000 10 3 1課 1000 11 3 2課 1000 12 3 3課 1100 10 1 A商事 1100 11 1 B商事 1100 12 1 C商事 1100 10 2 A商事の住所 1100 11 2 B商事の住所 1100 12 2 C商事の住所 テーブル名;TRAN_TABLE カラム名 ・連番 ・支店コード ・部署コード ・課コード ・得意先コード ・得意先住所コード サンプルデータ 連番、支店コード、部署コード、課コード、得意先コード、得意先住所コード 1 10 12 10 10 10 2 11 11 12 11 11 3 12 10 11 12 12 上記のようなテーブルがあり トランザクショテーブルからマスタを参照し、 コードではなく名称で取得できるVIEWを作成しました。 select * from TRAN_TABLE A, (select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=1) SHITEN, (select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=2) BUSHO, (select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=3) KA, (select コード、名称 from MASTER_CODE where 区分=1100 AND レベル=1) TORIHIKISAKI, (select コード、名称 from MASTER_CODE where 区分=1100 AND レベル=2) TORIJUSHO WHERE SHITEN.コード(+)=A.支店コード AND BUSHO.コード(+)=A.部署コード AND KA.コード(+)=A.課コード AND TORIHIKISAKI.コード(+)=A.得意先コード AND TORIJUSHO.コード(+)=A.得意先住所コード  上記のSQLだとレスポンスがよくありません。 (実際はマスターテーブルに多くのデータを登録してあります) 同じMASTER_CODEを使用しているので、もっと良い方法があるのでしょうか? ご回答宜しくお願いします。

  • 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
  • 日付の古い順番に削除したいのですが

    レコード登録時にテーブルの件数が規定数を越えているならば、指定件数分の既存レコードを削除したいのですが、方法が見つかりません。 目的のテーブルは以下のような構造になっております。 P-Key1:大枠のID(プライマリキー1) P-Key2:大枠内の序列を表す(プライマリキー2) THRED:登録元スレッド番号(プライマリキー3) FILE:ファイルパスを格納 TIMESTAMP:登録日付、DATE型 TERMID:端末ID(プライマリキー4) この内、削除時に指定するのはスレッド番号と端末IDだけです。 残りのプライマリキーが一つならば、IN句の副問い合わせでできそうな感じですが、2つある為、IN句では指定できませんでした。 以下は、試したSQL文です。ただし、全部失敗しております。 DELETE FROM (select * FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' ORDER BY TIMESTAMP) WHERE ROWNUM < 3; DELETE FROM テーブル WHERE P-Key1 IN (SELECT P-Key1 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP) AND P-Key2 IN (SELECT P-Key2 FROM テーブル WHERE THREAD = 1 AND TERMID = '端末ID' AND ROWNUM < 3 ORDER BY TIMESTAMP); よろしくお願いします。