You need to enable JavaScript to run this app. Snowflake中按预约日期统计客户累计到访不同门店数的SQL问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 00:54:03