低版本MySQL不使用LAG函数如何计算月度相邻行数据的差值?
实现思路
- 先给每个月份映射对应的数字序号,方便匹配上一个月的记录
- 对销量表做自关联,关联条件设为当前月的序号 = 上月序号 + 1
- 用当前月销量减去上月销量得到差值,过滤掉没有上月数据的1月即可
具体SQL语句
如果你的Month字段存储的是「一月、二月」这类中文文本,可直接用以下语句:
SELECT t1.Month, (t1.Qty - t2.Qty) AS 差值 FROM sales t1 LEFT JOIN sales t2 ON ( CASE t1.Month WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' THEN 5 END ) = ( CASE t2.Month WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' THEN 5 END ) + 1 WHERE t2.Qty IS NOT NULL ORDER BY CASE t1.Month WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' THEN 5 END;
如果你的Month字段本身存储的是1、2、3、4、5这类数字序号,SQL可以简化为:
SELECT t1.Month, (t1.Qty - t2.Qty) AS 差值 FROM sales t1 LEFT JOIN sales t2 ON t1.Month = t2.Month + 1 WHERE t2.Qty IS NOT NULL ORDER BY t1.Month;
输出结果
针对你提供的测试数据,执行后输出结果和预期完全一致:
| Month | 差值 |
|---|---|
| 二月 | -1 |
| 三月 | 6 |
| 四月 | -6 |
| 五月 | 4 |
内容的提问来源于stack exchange,提问作者Ryan McBride
相关产品推荐
相关产品推荐

