0

私のテーブルは重複した電子メール アドレスで構成されています。各電子メール アドレスには、一意の作成日と一意の ID があります。最新の作成日とそれに関連付けられた ID で電子メール アドレスを特定し、重複する ID とその作成日も表示したいと考えています。これを次の形式で表示するクエリを希望します。

  • 列 1: メールアドレス
  • 列 2: IDKeep
  • 列 3: CreateDateofIDKeep
  • 列 4: 重複 ID
  • 列 5: CreateDateofDuplicateID

注: 重複する電子メール アドレスが 2 つ以上存在する場合があります。これらのインスタンスで EmailAddress と IDKeep を再記述して、クエリで新しい行に追加の重複をそれぞれ表示したいと思います。

ここで見つかったさまざまなクエリをつなぎ合わせようとしましたが、役に立ちませんでした。私は現在途方に暮れています-どんな助け/指示も大歓迎です.

4

2 に答える 2

1

複雑なクエリは、分割して段階的に作業することで解決するのが最善です。

最初に、保持したい行のキーを見つけるためのクエリを作成しましょう。各メールの最新の作成日を見つけてから、結合して 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同じ行が得られないことに注意してください。keepdup

于 2015-04-02T01:27:01.163 に答える
0

次のサブクエリは、トリックを使用して、各メールの最新の ID と作成日を取得します。

select Email, max(CreateDate) as CreateDate,
       substring_index(group_concat(id order by CreateDate desc), ',', 1) as id
from myTable
group by Email
having count(*) > 1;

このhaving()句は、これが重複した電子メールのみであることも保証します。

次に、このクエリを残りのデータと組み合わせて、必要な形式を取得するだけです。

select t.Email, tkeep.id as keep_id, tkeep.CreateDate as keep_date,
       id as dup_id, CreateDate as dup_CreateDate
from myTable t join
     (select Email, max(CreateDate) as CreateDate,
             substring_index(group_concat(id order by CreateDate desc), ',', 1) as id
      from myTable
      group by Email
      having count(*) > 1
     ) tkeep
     on t.Email = tkeep.Email and t.CreateDate <> tkeep.CreateDate;
于 2015-04-02T01:58:11.877 に答える