如何修改SQL查询实现满足任一条件即从suppression list排除用户
问题原因
你原来的SQL使用UNION取两个集合的并集,逻辑是「只要满足近1年没下单 或 没打开过邮件任意一条,就进入列表」,和你需要的规则完全相反:你要的是「近1年有下单 或 有打开邮件任意一条就排除」,也就是最终进入列表的用户需要同时满足近1年无下单、无邮件打开两个条件。
修正方案
方案1:基于你现有的email_no_opens表(存储无打开记录的用户)
直接用逻辑与关联两个条件即可:
SELECT DISTINCT c.CUSTOMER_UUID FROM Customers c -- 条件1:近1年无下单记录 WHERE c.last_transaction_date <= DATEADD(YEAR, -1, GETDATE()) -- 条件2:无邮件打开记录 AND c.CUSTOMER_UUID IN (SELECT CUSTOMER_UUID FROM [email_no_opens])
也可以用内连接实现,大数据量下性能更优:
SELECT DISTINCT c.CUSTOMER_UUID FROM Customers c INNER JOIN [email_no_opens] e ON c.CUSTOMER_UUID = e.CUSTOMER_UUID WHERE c.last_transaction_date <= DATEADD(YEAR, -1, GETDATE())
方案2:如果你有原始邮件行为表(存储所有打开/点击等事件)
用NOT EXISTS写法逻辑更直观,不需要依赖预计算的email_no_opens表:
SELECT DISTINCT c.CUSTOMER_UUID FROM Customers c WHERE -- 近1年无下单 c.last_transaction_date <= DATEADD(YEAR, -1, GETDATE()) -- 无任何邮件打开记录 AND NOT EXISTS ( SELECT 1 FROM email_events ee WHERE ee.CUSTOMER_UUID = c.CUSTOMER_UUID AND ee.event_type = 'open' )
注意事项
如果你的Customers表存在从未下单的用户,last_transaction_date可能为NULL,需要额外补充OR c.last_transaction_date IS NULL到WHERE条件里,避免这部分用户被遗漏。
内容的提问来源于stack exchange,提问作者rtys
相关产品推荐
相关产品推荐

