SQL如何实现同比环比增长率计算_通过LAG函数与聚合计算

张开发
2026/4/21 2:39:05 15 分钟阅读

分享文章

SQL如何实现同比环比增长率计算_通过LAG函数与聚合计算
LAG函数必须显式指定ORDER BY时间字段如dt配合PARTITION BY防跨组混算月环比需先聚合再窗口计算首行NULL需用NULLIF避免除零同比应补全时间序列而非硬写LAG(...,12)。LAG 函数怎么写才能正确取上期值核心问题不是 LAG 会不会用而是它默认按什么顺序取、取错行就全错。必须显式指定 ORDER BY且排序字段得是时间维度比如 dt 或 month不能依赖表里物理顺序。常见错误现象LAG(sales) OVER () 没写 ORDER BY结果每行的“上月值”随机漂移或者用 id 排序但 id 和业务时间不一致导致同比算成隔壁门店的数据。必须写成 LAG(sales) OVER (PARTITION BY region ORDER BY dt)PARTITION BY 防止跨区域混算如果原始数据是日粒度但要算月环比先按月聚合再用 LAG别在日级上直接 LAG 后再分组——那样会多出几十倍中间行PostgreSQL 和 ClickHouse 支持 LAG(value, 2) 取前两期但 MySQL 8.0 才支持偏移量参数旧版只能嵌套窗口函数同比和环比的分母为什么老是 NULLLAG 在首行没上期值自然返回 NULL如果没处理整个增长率表达式就会变成 NULL。这不是 bug是设计如此——但业务报表里不能留空。使用场景月初跑上月环比时1月数据没有“上月”但你仍需显示 0% 或 “-” 而非空白。用 COALESCE(LAG(sales), 0) 简单兜底危险分母为 0 会触发除零错误得拆开判断安全写法是CASE WHEN LAG(sales) 0 THEN NULL ELSE (sales - LAG(sales)) / LAG(sales) END更稳妥的先用 NULLIF(LAG(sales), 0) 把分母 0 转成 NULL再整体除避免报错按年同比 vs 按月环比窗口定义差在哪同比看的是“去年同月”环比看的是“上一周期”两者时间跨度不同不能共用一个 LAG 偏移量。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器

更多文章