• ベストアンサー

重複したデータの除外(条件に一致するレコードを残す)

以下のようなデータがあります 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の列を取り出したいです どうしたらいいでしょうか?

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

こんな感じでどうですか? 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

tanoi_rock
質問者

お礼

2008でしたので 二つ目のクエリ参考にさせていただきました 本当に助かりました! ありがとうございます!!

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

#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)
回答No.2

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 でどうでしょう。

tanoi_rock
質問者

お礼

ありがとうございます!!! 勉強になります!

関連するQ&A