如何在Snowflake中实现每月过去12个月新客户的滚动求和
解决Snowflake中滚动12个月新客户总和计算问题
我来帮你搞定这个需求!首先咱们得先处理日期格式,再用窗口函数实现滚动求和,下面是直接可用的SQL代码,完全匹配你想要的结果:
WITH formatted_dates AS ( SELECT TO_DATE(date, 'DD.MM.YY') AS report_date, "New Customers" AS new_customers FROM customer_data -- 替换成你的实际表名 ) SELECT TO_CHAR(report_date, 'DD.MM.YY') AS "Reporting Date", SUM(new_customers) OVER ( ORDER BY report_date RANGE BETWEEN INTERVAL '11 months' PRECEDING AND CURRENT ROW ) AS "Customer #" FROM formatted_dates -- 过滤掉没有足够12个月历史的日期,确保结果从01.03.22开始 WHERE report_date >= (SELECT DATEADD(month, 11, MIN(report_date)) FROM formatted_dates) ORDER BY report_date;
代码细节解释:
- 日期格式化:用CTE
formatted_dates把原始的字符串日期(比如01.04.21)转换成Snowflake可识别的日期类型,这样才能准确做日期范围计算。 - 滚动求和核心:
SUM(new_customers) OVER(...)是实现需求的关键,ORDER BY report_date保证按时间顺序计算,RANGE BETWEEN INTERVAL '11 months' PRECEDING AND CURRENT ROW指定了计算范围——从当前日期往前推11个月(加上当前月正好是12个月周期)到当前日期的所有新客户数之和,这种方式即使后续数据有缺失月份也能准确计算,比按行数统计更可靠。 - 结果范围过滤:
WHERE子句筛选出那些有完整12个月历史的日期,这样结果就和你期望的从01.03.22开始一致了。 - 格式还原:最后用
TO_CHAR()把日期转回你需要的DD.MM.YY格式,并且按日期排序输出。
如果你的数据能保证每个月都有一条记录,也可以用按行数统计的简化版本(但不如日期范围的方式健壮):
WITH formatted_dates AS ( SELECT TO_DATE(date, 'DD.MM.YY') AS report_date, "New Customers" AS new_customers FROM customer_data ) SELECT TO_CHAR(report_date, 'DD.MM.YY') AS "Reporting Date", SUM(new_customers) OVER ( ORDER BY report_date ROWS BETWEEN 11 PRECEDING AND CURRENT ROW ) AS "Customer #" FROM formatted_dates WHERE report_date >= (SELECT DATEADD(month, 11, MIN(report_date)) FROM formatted_dates) ORDER BY report_date;
把customer_data替换成你的实际表名,运行后就能得到你想要的结果集啦!
内容的提问来源于stack exchange,提问作者timy




