在Snowflake中基于每行动态日期条件添加客户统计列
Snowflake中计算动态52周窗口内的唯一客户数
要实现对每一行week_ending日期,统计其往前52周至该日期区间内的唯一客户数量,可以采用以下两种方案:
方案1:关联子查询(精确计数)
逻辑直观,适合数据量中等的场景,对每个日期单独查询对应窗口内的唯一客户数:
SELECT t.week_ending, t.sales, (SELECT COUNT(DISTINCT customer_id) FROM your_table sub WHERE sub.week_ending BETWEEN DATEADD(WEEK, -52, t.week_ending) AND t.week_ending) AS last_year_cust_count FROM your_table t WHERE t.year = 2022 ORDER BY t.week_ending;
方案2:窗口函数(近似/高效计数)
如果业务允许近似结果,使用Snowflake的APPROX_COUNT_DISTINCT窗口函数可以获得更好的性能,尤其适合大数据量场景:
SELECT week_ending, sales, APPROX_COUNT_DISTINCT(customer_id) OVER ( ORDER BY week_ending RANGE BETWEEN INTERVAL '52 weeks' PRECEDING AND CURRENT ROW ) AS last_year_cust_count FROM your_table WHERE year = 2022 ORDER BY week_ending;
注意事项
- 替换代码中的
your_table为实际表名,customer_id为表中唯一标识客户的字段; - 确保
week_ending字段为日期类型,DATEADD函数的计算逻辑符合业务对“52周区间”的定义; - 若必须精确计数且数据量极大,可考虑预先按周聚合客户数据,再通过窗口函数累加去重(需结合更复杂的逻辑处理重复客户)。
内容的提问来源于stack exchange,提问作者Nisar_Haq
相关产品推荐
相关产品推荐

