複雑なクエリは、分割して段階的に作業することで解決するのが最善です。
最初に、保持したい行のキーを見つけるためのクエリを作成しましょう。各メールの最新の作成日を見つけてから、結合して Id を取得します。
select x.Email, x.CreateDate, x.Id
from myTable x
join (
select Email, max(CreateDate) as CreateDate
from myTable
group by Email
) y on x.Email = y.Email and x.CreateDate = y.CreateDate
では、重複するメール アドレスを取得するクエリを作成しましょう。
select Email
from myTable
group by Email
having count(*) > 1
そして、このクエリをテーブルに結合して、重複があるすべての行のキーを取得します。
select x.Email, x.Id, x.CreateDate
from myTable x
join (
select Email
from myTable
group by Email
having count(*) > 1
) y on x.Email = y.Email
偉大な。あとは、最初のクエリをこのクエリと結合して結果を取得するだけです。
select keep.Email, keep.Id as IdKeep, keep.CreateDate as CreateDateOfIdKeep,
dup.Id as DuplicateId, dup.CreateDate as CreateDateOfDuplicateId
from (
select x.Email, x.CreateDate, x.Id
from myTable x
join (
select Email, max(CreateDate) as CreateDate
from myTable
group by Email
) y on x.Email = y.Email and x.CreateDate = y.CreateDate
) keep
join (
select x.Email, x.Id, x.CreateDate
from myTable x
join (
select Email
from myTable
group by Email
having count(*) > 1
) y on x.Email = y.Email
) dup on keep.Email = dup.Email and keep.Id <> dup.Id
結合の最後の述語により、 と の両方でkeep.Id <> dup.Id
同じ行が得られないことに注意してください。keep
dup