同比需用LAG(value, 12)并确保按year_month升序排列环比用LAG(value, 1)且须先聚合到对应周期注意排序、补全数据、NULL处理及索引优化。怎么用 LAG 算同比和去年同月比同比本质是「当前行」和「往前偏移 N 行」的值做差或比关键是算准偏移量。比如按月分组后2024-05 的同比要拉 2023-05不是简单 LAG(value, 1)——那只是上个月。得先保证数据已按 year_month 排序再用 LAG(value, 12)月粒度或 LAG(value, 4)季度粒度。常见错误没排序就直接 LAG结果错位或者用 ORDER BY created_at 但字段含时分秒导致同月多行顺序不确定。必须显式 ORDER BY year_month ASC推荐用整数年月如 202405避免字符串排序出错如果原始数据缺某些月份比如 2023-02 没记录LAG(value, 12) 会跳过空缺直接取更早的非空值——这不是 bug是预期行为需提前补全月份注意时区若 year_month 是从 created_at 提取确保提取逻辑统一例如都用 TO_CHAR(created_at AT TIME ZONE Asia/Shanghai, YYYYMM)怎么用 LEAD 算环比和上期比环比更简单就是和紧邻上一期比通常用 LAG(value, 1) 就够了。但“上期”定义必须明确是按时间顺序的上一行不是按业务逻辑的“上一个自然周期”。比如用户活跃数按天统计LAG(active_users, 1) 就是昨天但如果是周报就得先聚合到周粒度再 LAG否则会把周一到周日七行都当成“本期”。容易踩的坑是没做预聚合。直接在明细表上跑 LAG可能得到“同一周内某天 vs 前一天”而不是“本周 vs 上周”。先 GROUP BY week_start_date或用 DATE_TRUNC(week, dt)再开窗LEAD 其实不常用在环比——它往“后”取而环比需要“往前”参照坚持用 LAG 更直观当存在多维度分组比如按 region 和 productPARTITION BY region, product ORDER BY month 必须写全漏一个就会跨区混算NULL 怎么处理同比/环比结果经常是 NULL只要第一行、或前 N 行没数据LAG/LEAD 就返回 NULL——这是 SQL 标准行为不是函数写错了。但业务报表里不能留一堆 NULL得主动处理。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。