Snowflake SQL日期筛选:如何提取无有效订阅的非活跃客户
筛选Snowflake中非活跃客户的正确方法
问题核心
你需要识别无当前/活跃订阅的客户:只要某个客户存在任意一条Date_End晚于指定日期(示例为2023-01-05)的合同,就属于活跃客户需排除;仅当该客户所有合同的Date_End均早于或等于指定日期时,才是非活跃客户需保留。
你最初的SQL错误在于:它返回了所有过期合同记录,包括那些本身有活跃合同的客户的历史过期数据,导致结果混入活跃客户的重复条目。
解决方案
以下是几种适用于Snowflake的高效实现方式:
1. GROUP BY + HAVING(最直接)
按客户ID分组,通过判断该客户的最晚合同结束日期是否符合非活跃条件,同时获取唯一客户名称:
SELECT MAX(Name) AS Name, -- 同一ID对应唯一Name,用MAX/MIN均可 ID FROM your_table GROUP BY ID HAVING MAX(Date_End) <= '2023-01-05'
2. 子查询排除活跃ID
先筛选出所有拥有活跃合同的ID,再从原表中排除这些ID并去重:
SELECT DISTINCT Name, ID FROM your_table WHERE ID NOT IN ( SELECT DISTINCT ID FROM your_table WHERE Date_End > '2023-01-05' )
3. 窗口函数标记客户状态
通过窗口函数计算每个客户的最晚合同结束日期,再筛选符合非活跃条件的记录:
WITH customer_summary AS ( SELECT Name, ID, MAX(Date_End) OVER (PARTITION BY ID) AS latest_contract_end FROM your_table ) SELECT DISTINCT Name, ID FROM customer_summary WHERE latest_contract_end <= '2023-01-05'
补充说明
- 若需使用当前日期而非固定日期,将
'2023-01-05'替换为CURRENT_DATE()(Snowflake推荐使用该函数,与GETDATE()功能一致)。 - 记得将
your_table替换为你实际的表名。
内容的提问来源于stack exchange,提问作者JLuu
相关产品推荐
相关产品推荐

