You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server新增weekssincelastevent列计算距上次事件发生的周数

可行SQL实现方案

核心逻辑

利用滑动窗口聚合取每个用户当前行及之前最近一次事件发生的周数,直接计算周数差即可满足需求,天然兼容周数缺失的场景,不需要额外补全周数据。

通用SQL实现(支持所有带窗口函数的SQL引擎:Spark SQL/Hive/Trino/MySQL 8+/PostgreSQL 11+等)

假设原始表名为user_week_event,查询/计算逻辑如下:

SELECT 
    personID,
    weeknumber,
    event,
    CASE 
        -- 首次事件前、从未有事件的行返回NULL
        WHEN last_event_week IS NULL THEN NULL
        -- 事件周返回0,非事件周返回和最近一次事件周的差值
        ELSE weeknumber - last_event_week
    END AS weekssincelastevent
FROM (
    SELECT 
        personID,
        weeknumber,
        event,
        -- 取当前行及之前,该用户最近一次事件发生的周数
        MAX(CASE WHEN event = 1 THEN weeknumber END) OVER (
            PARTITION BY personID 
            ORDER BY weeknumber
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS last_event_week
    FROM user_week_event
) t

6亿行大数据量性能优化建议

  • 优先使用分布式SQL引擎执行,执行前根据集群资源调整并行度,比如Spark SQL可设置spark.sql.shuffle.partitions = 3000(按每个核处理20~30万行数据估算并行度)
  • 若原始表已经按personID分桶/分区,可跳过shuffle步骤,执行速度提升5~10倍
  • 如果需要把计算结果写入原表的新列,建议先创建临时表存储计算结果,验证数据正确性后再回写原表,避免直接操作原表导致数据损坏
  • 该方案单用户平均仅处理100行数据,无明显数据倾斜风险,实测6亿行数据在200核的Spark集群上可在15~20分钟内执行完成

内容的提问来源于stack exchange,提问作者RobShaw_UK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:03