• ベストアンサー

DISTINCTの使い方について

---------------------------------  元データ --------------------------------- ID CATEGORY CREATE_DATE 001 A100 2008/10/01 002 B100 2009/01/01 003 C100 2009/01/01 004 A100 2009/02/01 005 B100 2009/02/01 006 A100 2009/03/01 --------------------------------- ---------------------------------  出力したい形式 --------------------------------- ID CATEGORY CREATE_DATE 003 C100 2009/01/01 005 B100 2009/02/01 006 A100 2009/03/01 --------------------------------- 「CATEGORY」でユニークになるようにしたいと思っています。 重複しているものは、最新のデータ(CREATE_DATEが新しいもの)を 優先して取得したいと思っています。 ============================= SELECT DISTINCT(CATEGORY) CATEGORY, ID, CREATE_DATE FROM TABLE_NAME ORDER BY CREATE_DATE DESC ============================= というSQLを書いてみましたが、「CATEGORY」でユニークになって くれません。 また「CREATE_DATEが新しいもの」という点はORDER BY で行えば 良いのでしょうか? 以上、よろしくお願いいたします。

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

  • ベストアンサー
  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.4

No,1です。 IDがユニークになってるのでしたね。 申し訳ありません。 副照会(キー抽出)を カテゴリー毎に最大日付をとるようにしてみたら いかがでしょうか。 SELECT A.CATEGORY, A.ID, A.CREATE_DATE FROM TABLE_NAME A, (SELECT CATEGORY, MAX(CREATE_DATE) as CREATE_DATE FROM TABLE_NAME GROUP BY CATEGORY) B WHERE A.CATEGORY = B.CATEGORY AND A.CREATE_DATE = B.CREATE_DATE

MixNuts
質問者

お礼

ありがとうございます。 意図した結果が出るようになりました。 ユニークにする=DISTINCTを使う、という考えでいましたが、 このような方法もあるのですね。 大変参考になりました。 (1つのSQLの中で、SELECTを2回使う、ということは今まで使ったことがありませんでした。 この辺のアイデア・使えるようになると利用範囲が広がりそうです。) ありがとうございました。

その他の回答 (3)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

select * from 元データ a where not exists ( select 1 from 元データ b where a.category=b.category and a.create_date<b.create_date ) もありでしょうか。

MixNuts
質問者

お礼

ご回答、ありがとうございます。 このようなやり方もあるんですね。 参考になりました。 ありがとうございます。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

分析関数が使えるバージョンなら select ID,CATEGORY,CREATE_DATE from ( select ID,CATEGORY,CREATE_DATE,row_number() over( partition by category order by create_date desc ) rn from 元データ ) where rn = 1

MixNuts
質問者

お礼

ご回答、ありがとうございます。 そのような方法もあるんですね。 今の私にはちょっとハードルが高いので、今後の参考にさせてもらいます。 ありがとうございました。

  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.1

「CATEGORY」でユニークにするなら、 まずキー抽出をする必要があります。 またORDER BYは、並び順を決めるだけで 「CREATE_DATEが新しいものを抜き出す」ということは出来ません。 その場合は一般的にMAX関数を使うと思います。 例として以下のSQLをご参考にどうぞ。 SELECT A.CATEGORY, A.ID, MAX(CREATE_DATE) FROM TABLE_NAME A, (SELECT DISTINCT CATEGORY FROM TABLE_NAME) B WHERE A.CATEGORY = B.CATEGORY GROUP BY A.CATEGORY, A.ID

MixNuts
質問者

お礼

早速のご回答、ありがとうございます。 まずキーを抽出する必要があるということですね。 その点、勉強するようにしたいと思います。 試しに、教えていただいたSQLを元に実行してみましたが CATEGORYでユニークになりませんでした。 考えられる原因分かりますでしょうか? よろしくお願いいたします。

関連するQ&A