如何匹配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
相关产品推荐
相关产品推荐

