Snowflake中按预约日期统计客户累计到访不同门店数的SQL问题
正确实现方案
方案1:直接使用Snowflake原生窗口去重计数(最简单高效)
Snowflake原生支持窗口函数中使用COUNT(DISTINCT)配合排序规则,直接就能满足按日期累计统计唯一门店数的需求:
SELECT Client_ID AS Customer_ID, Appointment_Date, Store_ID, COUNT(DISTINCT Store_ID) OVER ( PARTITION BY Client_ID ORDER BY Appointment_Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS Count_Different_Stores FROM 你的表名 ORDER BY Appointment_Date, Client_ID;
逻辑说明:按Client_ID分组,每组内按Appointment_Date排序,统计从最早记录到当前行的所有记录中去重后的Store_ID数量,完全匹配需求。
方案2:首次到访标记累加(兼容全场景、性能更稳定)
如果数据量极大,窗口去重计数性能不足,可以用首次到访标记+累加的方式实现:
WITH store_first_visit AS ( SELECT Client_ID, Store_ID, MIN(Appointment_Date) AS first_visit_date FROM 你的表名 GROUP BY Client_ID, Store_ID ) SELECT t.Client_ID AS Customer_ID, t.Appointment_Date, t.Store_ID, COUNT(DISTINCT CASE WHEN s.first_visit_date <= t.Appointment_Date THEN s.Store_ID END) AS Count_Different_Stores FROM 你的表名 t LEFT JOIN store_first_visit s ON t.Client_ID = s.Client_ID GROUP BY t.Client_ID, t.Appointment_Date, t.Store_ID ORDER BY t.Appointment_Date, t.Client_ID;
原写法错误原因
- 第一种写法的
PARTITION BY CLIENT_ID, STORE_ID是把每个客户的每个门店单独分组排名,只会统计单个门店的到访次数,不会跨门店去重。 - 第二种写法没有按日期排序,分区同样加入了STORE_ID,无法保证按到访顺序累计不同门店的数量,结果自然不稳定。
内容的提问来源于stack exchange,提问作者VBAmazing
相关产品推荐
相关产品推荐

