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

如何匹配yr与mnth获取非连续上月数据?lag函数无法精准使用

获取上月销售额的解决方案

当然可以通过匹配年份(yr)和月份(mnth)字段来获取对应上月的数据,核心是先计算出每行数据对应的上月年月,再通过自关联匹配对应的销售额。以下是两种常见实现方式:

方式1:手动判断年月逻辑

直接通过条件判断处理1月的跨年情况,适合逻辑清晰的场景:

SELECT
    t1.品类,
    t1.yr AS 当前年份,
    t1.mnth AS 当前月份,
    t1.销售额 AS 当前销售额,
    t2.销售额 AS 上月销售额
FROM
    销售表 t1
LEFT JOIN
    销售表 t2 
    ON t1.品类 = t2.品类
    AND (
        -- 1月的上月是前一年的12月
        (t1.mnth = 1 AND t2.yr = t1.yr - 1 AND t2.mnth = 12)
        -- 其他月份直接取同年份的上月
        OR (t1.mnth > 1 AND t2.yr = t1.yr AND t2.mnth = t1.mnth - 1)
    )
ORDER BY
    t1.yr, t1.mnth;

执行后,原表中没有对应上月数据的行(比如2019年1月、2019年3月),上月销售额会显示NULL,符合实际业务逻辑。

方式2:借助日期函数计算(更通用)

通过将年月转换为日期,再计算上月日期并拆分回年月,避免手动判断,适配更多SQL方言:

SELECT
    t1.品类,
    t1.yr AS 当前年份,
    t1.mnth AS 当前月份,
    t1.销售额 AS 当前销售额,
    t2.销售额 AS 上月销售额
FROM
    销售表 t1
LEFT JOIN
    销售表 t2 
    ON t1.品类 = t2.品类
    AND YEAR(DATE_SUB(STR_TO_DATE(CONCAT(t1.yr, '-', t1.mnth, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH)) = t2.yr
    AND MONTH(DATE_SUB(STR_TO_DATE(CONCAT(t1.yr, '-', t1.mnth, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH)) = t2.mnth
ORDER BY
    t1.yr, t1.mnth;

注:不同数据库的日期函数语法略有差异,比如PostgreSQL用TO_DATE替代STR_TO_DATE,SQL Server用DATEADD(MONTH, -1, ...)替代DATE_SUB,但核心逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:28