• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL MAX関数を検索条件にする。)

SQL MAX関数を使用したデータの抽出方法

このQ&Aのポイント
  • SQLのMAX関数を使用して、各品番ごとの最新日付のデータを抽出する方法を教えてください。
  • 過去に同様の質問をしましたが、解決できずに困っています。お力をお貸しいただけると助かります。
  • 抽出したいデータは、ID、品番、金額、日付の情報で、各品番について最新日付のデータのみを表示したいです。

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

  • ベストアンサー
回答No.1

下記のSQL文を参照してください。 SELECT TB1.ID , TB1.HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ] TB1.KINGAKU , -- 金額(KINGAKU) [ NUMBER(7,0) NULL ] TB1.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] FROM TEST_TABLE TB1 INNER JOIN( SELECT HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ] MAX(HIZUKE) AS HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] FROM TEST_TABLE GROUP BY HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ] ) TB2 ON TB1.HINBAN = TB2.HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ] AND TB1.HIZUKE = TB2.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] 注:SQL文実行の結果は添付画像を参照してください。

anman0201
質問者

お礼

すいません。 Group Byの存在を忘れてました。 無事解決しました。 ありがとうございます。 

anman0201
質問者

補足

ご回答ありがとうございます。 大変参考になりました。 この方法でできたと思ったんですが、新たに問題が出てきてしまいました。 TB1のレコードで稀に最新日付が同一のものがあり、その品番についてINNERJOINすると あたりまえですがその品番だけ2行抽出されてしまいます。 このような品番が出た場合、金額が安いほうをとってきたいのですが、 なにか方法はありますでしょうか? 品番が重複するようなことはどうしても避けたいのです。 お手数ですがなにかよい方法があれば教えていただきたいです。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

相関サブクエリを使っても出来ますね。 テーブルの定義は1の方と同じとして、下記の様になります。 例) -------------------------------------------------- SELECT * FROM TEST_TABLE a WHERE NOT EXISTS ( SELECT 1 FROM TEST_TABLE b WHERE a.HINBAN = b.HINBAN AND a.HIZUKE < b.HIZUKE ) ------------------------------------------------------ 「各品番について最新日付のデータ」は以下の様に読み替えられます。 「『同じ品番でより新しい日付の別のデータ』が無いデータ」 これをSQLで表現していることになります。

参考URL:
http://codezine.jp/article/detail/1076?p=2
anman0201
質問者

お礼

ご回答ありがとうございます。 初めて知る関数です。 なんか便利そうですね。 後学のために頭の中にとどめておきます。 また大変申し訳ないんですが、新たな問題が出てきてしまいました。 補足欄に追記させていただきましたので、 お時間があれば助けていただきたいです。 よろしくお願いします。

関連するQ&A