- ベストアンサー
重複したデータの除外(条件に一致するレコードを残す)
以下のようなデータがあります ID|MAIL|TYPE|DATE 1 |a@a |0 |2009/01/01 2 |b@b |0 |2009/02/02 3 |a@a |1 |2008/01/01 4 |c@c |1 |2009/01/01 5 |b@b |0 |2009/01/02 このようなテーブルから 同じMAILが存在すれば、TYPEが0のものを優先、DATEが古いものを優先 という条件で重複除外を行いたいです 例のデータだとIDが1,4,5の列を取り出したいです どうしたらいいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでどうですか? DELETE t FROM TBL t WHERE t.ID NOT IN (SELECT TOP 1 ID FROM TBL WHERE MAIL=t.MAIL ORDER BY [TYPE],DATE) 2005以降ならばこういう書き方もあります(私は結構使います) DELETE t FROM (SELECT ROW_NUMBER() OVER (PARTITION BY MAIL ORDER BY [TYPE], DATE) SEQ,* FROM TBL) t WHERE SEQ>1
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
#1です。 重複除外というのは「重複除外して必要なものだけテーブルに残す」の意味ではなかったのですね。そういう削除を実行するクエリを載せてしまいました。 ROW_NUMBER()の方はもう別に回答がついているようなので、もうひとつの方を書いておきます。 SELECT * FROM TBL t WHERE t.ID IN (SELECT TOP 1 ID FROM TBL WHERE MAIL=t.MAIL ORDER BY [TYPE],DATE) 失礼しました。
- nora1962
- ベストアンサー率60% (431/717)
SQLSERVER 2005以降なら select a.id,a.mail,a.type,a.dt from ( select tbl.*, row_number() over( partition by mail order by type ,dt ) as rn from tbl) as a where rn = 1 でどうでしょう。
お礼
ありがとうございます!!! 勉強になります!
お礼
2008でしたので 二つ目のクエリ参考にさせていただきました 本当に助かりました! ありがとうございます!!