SQL - 如何删除表中的重复项并根据某些条件保留它们

问题描述 投票:0回答:1

我在使用 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
) 

任何可以为我指明正确方向的想法或建议都会非常有帮助。

非常感谢。

sql database database-design duplicates salesforce-marketing-cloud
1个回答
0
投票

我也会聚合每个电子邮件地址,然后检查每个电子邮件地址是否具有多个条目,以及是否存在具有不需要的密钥的实体。这样我就得到了我们想要删除的一组电子邮件地址。通过条件聚合(聚合函数内的

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 
);
© www.soinside.com 2019 - 2024. All rights reserved.