我在使用 SQL 方面完全是个初学者。我有一个场景,如果不满足以下条件,我需要删除重复项。
如果发现重复,请检查订户密钥是否以003或001或00Q开头; 如果为真,则保留所有重复项; 如果任何一个subscriberkey不满足条件,则删除所有重复项。
示例表:
| emailAddress | subscriberKey|
| ------------ | -------------|
| [email protected] | 0035656 |
| [email protected] | 0015623 |
| [email protected] | sdfsdfd |
| [email protected] | 0018956 |
| [email protected] | 00Q4522 |
结果应该是:
| emailAddress | subscriberKey |
| -------- | -------- |
| [email protected] | 0018956 |
| [email protected] | 00Q4522 |
我很难想象如何解决这个问题。我考虑先将它们分组以检查是否有重复,然后我对如何检查订户密钥感到困惑。
DELETE EmailAddress, SubscriberID, Status, SubscriberKey
FROM [getting duplicates] t1
WHERE EXISTS(
SELECT 1
FROM [getting duplicates] As t2
WHERE t1.EmailAddress = t2.EmailAddress
AND (t2.SubscriberKey NOT Like '003%' OR t2.SubscriberKey NOT Like '001%' OR t2.SubscriberKey NOT Like '00Q%' ) OR t2.Status = 'unsubscribed'
HAVING Count(*) > 1
)
任何可以为我指明正确方向的想法或建议都会非常有帮助。
非常感谢。
我也会聚合每个电子邮件地址,然后检查每个电子邮件地址是否具有多个条目,以及是否存在具有不需要的密钥的实体。这样我就得到了我们想要删除的一组电子邮件地址。通过条件聚合(聚合函数内的
CASE
表达式)来检查不需要的键。
delete from mytable
where emailaddress in
(
select emailaddress
from mytable
group by emailaddress
having count(*) > 1 -- duplicate
and count(case when left(subscriberkey) not in ('001', '003', '00Q') then 1 end) > 0 -- at least one undesired key
);