首页 > 解决方案 > MySQL 查询以查看过去 3 个月内的变化

问题描述

我想看看过去 3 个月的变化。

数据库:

数据库

MySQL:

SELECT DATE_FORMAT(CUR.time, '%Y %b') AS thisTime,
   MAX(CUR.value) AS thisValue,
   MAX(PRE.value) AS prevValue,
   MAX(CUR.value)-MAX(PRE.value) AS compValue
FROM test CUR
INNER JOIN test PRE
ON MONTH(PRE.time) = (SELECT MAX(MONTH(XXX.time))
                      FROM test XXX
                      WHERE MONTH(XXX.time) < MONTH(CUR.time))
WHERE CUR.time > DATE_SUB(NOW(), INTERVAL 3 MONTH)
GROUP BY MONTH(CUR.time)
ORDER BY CUR.id

结果:

结果

可以看到没有一月!

我想在过去 3 个月中看到这样的变化。有人有想法吗?

| 2019 Feb | 50 | 40 | 10 |
| 2019 Jan | 40 | 25 | 15 |
| 2018 Dec | 25 | 20 | 5  |

标签: mysql

解决方案


尝试MONTH在某个JOIN条件下使用的问题是在年底从 12 到 1 的环绕。将日期用作YEARMONTH字符串是最简单的:

SELECT DATE_FORMAT(t1.time, '%b %Y') AS thisTime,
       MAX(t1.value) AS thisValue,
       MAX(t2.value) AS prevValue,
       MAX(t1.value) - MAX(t2.value) AS compValue
FROM test t1
JOIN test t2 ON DATE_FORMAT(t2.time, '%Y%m') = (SELECT MAX(DATE_FORMAT(`time`, '%Y%m')) 
                                                FROM test t3 
                                                WHERE DATE_FORMAT(t3.time, '%Y%m') < DATE_FORMAT(t1.time, '%Y%m'))
GROUP BY thisTime
ORDER BY STR_TO_DATE(CONCAT('1 ', thisTime), '%d %b %Y') DESC

输出:

thisTime    thisValue   prevValue   compValue
Feb 2019    50          40          10
Jan 2019    40          25          15
Dec 2018    25          20          5

dbfiddle 上的演示


推荐阅读