2017-07-27 4 views
0

で重複を見つけます、電話と電子メール。 idはテーブルの各行に対して一意です。SQLは、私はトラブル次の要件のためのSQLクエリを書いを抱えている1列または他の列

電話番号またはの電子メール列を日付列に基づいて検索することで、重複レコードを見つける必要があります。 つまり、レコード内のまたはのメールが前回の日付に既に存在するかどうかを確認します。その場合は、重複としてマークしてください。

Data Table

Expected Output

+0

をあなたはDUPとしてマークされているか、少し説明することはできますか? –

+0

電話または電子メールが値を繰り返す場合、重複としてマークする必要があります。しかし、マーキングは日付に基づいて行う必要があります。重複する電話/電子メールを持つ最新のレコードは重複してマークする必要があります。私はこれが私の質問を説明することを願っています –

+0

[DBMS](https://en.wikipedia.org/wiki/Database)はどちらを使っていますか? Postgres?オラクル? DB2?ファイアバード? –

答えて

1

度Probこのような何か:あなたは、電話、電子メールや日付を越えたデータセットにdupesを持っている場合、これは非常にあなたを返す複数行になることがあり

select a.id, a.date, a.phone, a.email, 
case when b.phone is not null or c.email is not null then 'Duplicate' else 'Unique' end as flag 
from table a 
left join table b on (a.phone = b.phone and a.date > b.date) 
left join table c on (a.email = c.email and a.date > c.date) 

を結合のサブ選択が必要な場合があります。オリジナル

上記

例えば

left join (select distinct phone, date from table) b on (a.phone = b.phone and a.date > b.date) 

私はそれについていくつかのより多くを考えてきたし、電話やメールの以前のインスタンスがある場合は、参加の重複行を取得します。

これは、より良い動作するはず:

select a.id, a.date, a.phone, a.email, 
case when a.phone is null and a.email is null then null 
when sum(case when b.phone is not null or c.email is not null then 1 else 0 end) > 0 then 'Duplicate' else 'Unique' end as flag 
from table a 
left join table b on (a.phone = b.phone and a.date > b.date) 
left join table c on (a.email = c.email and a.date > c.date) 
group by a.id, a.date, a.phone, a.email 
+0

ねえ、これは完璧に動作します。ありがとう。電話機や電子メールのフィールド値が空でない場合、何をすればいいのか分かります...両方のフィールドがレコード内で空白の場合、フラグはNULLにする必要がありますが、いずれかのフィールドが使用可能な場合は、利用可能なフィールド。 –

+0

調整を行いました。元のバージョンでは重複した行が作成されていたため、これも調整されました。基本的にif ... then else ... end文をif文として使用して構築することができます。 – BigTimeStats

+0

素晴らしい!お手伝いありがとう –

関連する問題