2017-07-27 49 views
0
我無法寫入用於該被以下要求的SQL查詢

sql中找到重複:在一列或另一列

我具有由列的表:ID,日期(日/月/年) ,電話和電子郵件。 id對於表中的每一行都是唯一的。

我需要通過查找手機中的重複記錄基於日期列的電子郵件列來查找重複記錄。 即識別記錄中的電話電話是否已經存在於先前的日期。如果是這樣,請將其標記爲重複。

Data Table

Expected Output

+0

你能解釋一下,你是如何將其標記爲DUP? –

+0

如果電話或電子郵件重複一個值,它應該被標記爲重複。但是,標記應該根據日期來完成。帶有重複電話/電子郵件的最新記錄應標記爲重複。我希望這可以解釋我的問題 –

+0

你使用哪個[DBMS](https://en.wikipedia.org/wiki/Database)? Postgres的?甲骨文? DB2?火鳥? –

回答

1

習題做這樣的事情:

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

嘿,這工作完美。謝謝。如果手機或電子郵件中的字段值爲空,那麼我可以知道該怎麼辦......所以,如果兩個字段在記錄中都是空的,那麼標誌應該爲空,但是如果任何一個字段都可用,那麼它應該根據可用字段。 –

+0

進行了調整。還調整了它,因爲原始版本會爲您創建重複的行。你可以基本上使用case ... then ... else ...結束語句,如同語句並構建它們。 – BigTimeStats

+0

太棒了!感謝您的幫助 –