- ベストアンサー
SQL MAX関数を使用したデータの抽出方法
- SQLのMAX関数を使用して、各品番ごとの最新日付のデータを抽出する方法を教えてください。
- 過去に同様の質問をしましたが、解決できずに困っています。お力をお貸しいただけると助かります。
- 抽出したいデータは、ID、品番、金額、日付の情報で、各品番について最新日付のデータのみを表示したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
下記の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文実行の結果は添付画像を参照してください。
その他の回答 (1)
- root139
- ベストアンサー率60% (488/809)
相関サブクエリを使っても出来ますね。 テーブルの定義は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で表現していることになります。
お礼
ご回答ありがとうございます。 初めて知る関数です。 なんか便利そうですね。 後学のために頭の中にとどめておきます。 また大変申し訳ないんですが、新たな問題が出てきてしまいました。 補足欄に追記させていただきましたので、 お時間があれば助けていただきたいです。 よろしくお願いします。
お礼
すいません。 Group Byの存在を忘れてました。 無事解決しました。 ありがとうございます。
補足
ご回答ありがとうございます。 大変参考になりました。 この方法でできたと思ったんですが、新たに問題が出てきてしまいました。 TB1のレコードで稀に最新日付が同一のものがあり、その品番についてINNERJOINすると あたりまえですがその品番だけ2行抽出されてしまいます。 このような品番が出た場合、金額が安いほうをとってきたいのですが、 なにか方法はありますでしょうか? 品番が重複するようなことはどうしても避けたいのです。 お手数ですがなにかよい方法があれば教えていただきたいです。