みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DISTINCTの使い方について

---------------------------------
 元データ
---------------------------------
IDCATEGORYCREATE_DATE
001A1002008/10/01
002B1002009/01/01
003C1002009/01/01
004A1002009/02/01
005B1002009/02/01
006A1002009/03/01
---------------------------------

---------------------------------
 出力したい形式
---------------------------------
IDCATEGORYCREATE_DATE
003C1002009/01/01
005B1002009/02/01
006A1002009/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 で行えば
良いのでしょうか?

以上、よろしくお願いいたします。

投稿日時 - 2009-01-20 09:23:18

QNo.4645111

困ってます

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

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

投稿日時 - 2009-01-20 11:19:35

お礼

ありがとうございます。
意図した結果が出るようになりました。

ユニークにする=DISTINCTを使う、という考えでいましたが、
このような方法もあるのですね。
大変参考になりました。

(1つのSQLの中で、SELECTを2回使う、ということは今まで使ったことがありませんでした。
この辺のアイデア・使えるようになると利用範囲が広がりそうです。)

ありがとうございました。

投稿日時 - 2009-01-20 13:27:49

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

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

投稿日時 - 2009-01-20 11:09:41

お礼

ご回答、ありがとうございます。

このようなやり方もあるんですね。
参考になりました。

ありがとうございます。

投稿日時 - 2009-01-20 13:30:51

ANo.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

投稿日時 - 2009-01-20 10:17:09

お礼

ご回答、ありがとうございます。
そのような方法もあるんですね。

今の私にはちょっとハードルが高いので、今後の参考にさせてもらいます。
ありがとうございました。

投稿日時 - 2009-01-20 13:22:44

ANo.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

投稿日時 - 2009-01-20 09:54:44

お礼

早速のご回答、ありがとうございます。
まずキーを抽出する必要があるということですね。
その点、勉強するようにしたいと思います。

試しに、教えていただいたSQLを元に実行してみましたが
CATEGORYでユニークになりませんでした。
考えられる原因分かりますでしょうか?

よろしくお願いいたします。

投稿日時 - 2009-01-20 10:34:57

あなたにオススメの質問