You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动