假设我每个用户都有一张桌子,可以计算一年中一个月的SO声誉。
+-----+-------+------+
| rep | month | year |
+-----+-------+------+
| 10 | 12 | 2015 |
+-----+-------+------+
| 11 | 01 | 2016 |
+-----+-------+------+
| 12 | 02 | 2016 |
+-----+-------+------+
现在,要将数据显示到表格中,我希望该用户的起始年份,开始月份,结束年份和结束月份相应地缩放图表。
我的第一个想法是像这样的SQL请求:
SELECT MAX(YEAR) AS maxYear,
MAX(MONTH) AS maxMonth,
MIN(YEAR) AS minYear,
MIN(MONTH) AS minMonth
FROM Balance
但这只有效,因为我在2015年开始;-)。在新的一年开始之后它显示了错误的结果:它标记了1月份的第一个月,因为查询没有看到一个月是否对应于正确的年份。
所以我创造了这个:
SELECT MAX(YEAR) AS maxYear,
MAX(monthsOfMaxYear) AS maxMonth,
MIN(YEAR) AS minYear,
MIN(monthsOfMinYear) AS minMonth
FROM Balance,
(SELECT MONTH AS monthsOfMaxYear
FROM Balance
WHERE YEAR =
(SELECT MAX(YEAR)
FROM Balance)) AS a,
(SELECT MONTH AS monthsOfMinYear
FROM Balance
WHERE YEAR =
(SELECT MIN(YEAR)
FROM Balance)) AS b
但我对此并不满意,因为查询正在多次执行,例如SELECT MIN(YEAR) FROM Balance
。
有更好的解决方案吗?
答案 0 :(得分:1)
答案很简单:你不能把它与一年分开看一个月。因此,将两者从年份开始合并,以便正确地获得排序顺序:例如12/2015 = 201512.这是:将年份乘以100并添加月份。要再次提取月份,请使用其模数100:
SELECT MAX(YEAR) AS maxYear,
MAX(YEAR * 100 + MONTH) % 100 AS maxMonth,
MIN(YEAR) AS minYear,
MIN(YEAR * 100 + MONTH) % 100 AS minMonth
FROM Balance
答案 1 :(得分:0)
尝试以下查询 -
SELECT YEAR(MAX(CONCAT(`year`,'-',`month`,'-01'))) AS maxYear, MONTH(MAX(CONCAT(`year`,'-',`month`,'-01'))) AS maxMonth,
YEAR(MIN(CONCAT(`year`,'-',`month`,'-01'))) AS minYear, MONTH(MIN(CONCAT(`year`,'-',`month`,'-01'))) AS minMonth
FROM balance;
如果通过以下查询将日期和月份数据存储在日期格式中,您可以做得更好 -
SELECT YEAR(MAX(mydate)) AS maxYear, MONTH(MAX(mydate)) AS maxMonth,
YEAR(MIN(mydate)) AS minYear, MONTH(MIN(mydate)) AS minMonth
FROM balance;