无需CTE,如何用Union/Except筛选无同日Sale的Fee记录?
解决方案
要定位那些无对应同日Sale的Fee记录(比如你提到的客户1在2025-01-08的那条),不用CTE的话,可以靠UNION整合两类事件的关联数据来实现:
SELECT yt.Event, yt.`Event Date`, yt.`Client ID` FROM your_table_name yt INNER JOIN ( -- 用UNION把所有Fee和Sale的客户-日期组合分别标记类型,合并成一个数据集 SELECT `Client ID`, `Event Date`, 'Fee' AS event_type FROM your_table_name WHERE Event = 'Fee' UNION SELECT `Client ID`, `Event Date`, 'Sale' AS event_type FROM your_table_name WHERE Event = 'Sale' ) event_summary ON yt.`Client ID` = event_summary.`Client ID` AND yt.`Event Date` = event_summary.`Event Date` WHERE yt.Event = 'Fee' -- 分组后只留那些只有Fee类型的客户-日期组合 GROUP BY yt.`Client ID`, yt.`Event Date`, yt.Event HAVING COUNT(DISTINCT event_summary.event_type) = 1
逻辑说明
- 内层的
UNION把所有Fee和Sale事件按「客户ID+日期」维度拆分标记,相当于把两类事件的关联关系整理到了一个集合里 - 外层关联原表的Fee记录,通过分组计数筛选出那些分组里只有
Fee标记的记录——这就意味着该客户在当天没有对应的Sale事件 - 最终返回的就是完全符合要求的违规Fee记录
内容的提问来源于stack exchange,提问作者Paul Harper
相关产品推荐
相关产品推荐

