另外一种方法有瑕疵。两张表一模一样,001copy和001_copy1,将字段名改成不同名称。这里以最大值举例。
SELECT AA.2A,BB._5A,BB._id FROM (SELECT MAX(T.2A) `2A` FROM 001copy T
WHERE T.5A BETWEEN '2018-01-01' AND '2018-12-31' GROUP BY DATE_FORMAT(T.5A,'%Y-%m') DESC ) AA
JOIN 001_copy1 BB ON AA.2A=BB._2A;
先将001copy中的2A字段中最大值查询出来,再放入001_copy中,因为两个表内容一样,所以得出001_copy的_id和_5A,
最大的弊端就是如果2A字段中数据重复就麻烦了。得出的结果就不够准了。
如果是纯粹的sql语句:
事实上不建议这么做。
select xx数据,日期函数(这条数据的日期 转换成月份) from 这个表 where ???
有点像
1 201801
2 201801
3 。。。。
select from (select xx数据,日期函数(这条数据的日期 转换成月份) 日期 from 这个表 where ???)
group by 日期
方法已经找到,谢谢众位的帮忙。
将max和min查询的结果作为一张表,放到from语句的后面
SELECT T.id,T.2A,T.5A FROM 001copy T,(SELECT MAX(T.2A) AS 2A,MIN(T.2A) AS 21A
FROM 001copy T
WHERE T.5A BETWEEN '2019-01-01' AND '2019-12-31' GROUP BY DATE_FORMAT(T.5A,'%Y-%m')) AS M WHERE T.2A=M.2A OR T.2A=M.21A ;
具体逻辑是什么。我也说不清,但是的确解决了问题,我一一核对了一下,没有问题。
如果有大神不嫌弃,可以帮我们普及一下原理。谢谢。
谢谢诸位的帮忙和提示,用了两个方案,都不完美,第一个是非常笨的方法。
(SELECT * FROM `001copy` WHERE
`2A` = (SELECT MAX(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=1)
or `2A` = (SELECT MIN(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=1)
or `2A` = (SELECT MAX(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=2)
or `2A` = (SELECT MIN(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=2)
……
这样一直下去,非常的长,然后能选出自己想要的结果。
(其实结果也不完美,还是多了两条数据,有两个年份的某月最大值和最小值合在一起有三个,但是查看语句却没发现有多余的最大或最小值信息,后来在查询出来的结果中慢慢排查才解决了问题,到底是什么原因就不知道了。)
SELECT DATE_FORMAT(T.5A,'%Y-%m') 月份,MAX(T.2A) 最大值,MIN(T.2A) 最小值 FROM 001copy T WHERE T.5A >= ? AND T.5A <= ? GROUP BY DATE_FORMAT(T.5A,'%Y-%m')
) b on DATE_FORMAT(a.5A,'%Y-%m')= b.月份
where (a.2A =b.最大值 or a.2A = b.最小值)
按照您的要求,直接执行这个语句即可。
SELECT @id:=@id+1 id,t.2A,t.2A_1,t.5A FROM (SELECT MAX(T.2A) `2A`,MIN(T.2A) `2A_1`,DATE_FORMAT(T.5A,'%Y-%m') `5A`, @id:=0 FROM 001copy T WHERE T.5A >= ? AND T.5A <= ? GROUP BY DATE_FORMAT(T.5A,'%Y-%m')) t ;
表001copy有10年内120个月的数据,主键id,2A是数据,5A是日期,如下图
现在想得到每个月的最大值和最小值,如下图
现在用的方法是这个,只能一个月一个月地去做,有没有办法,一次性把120个月每个月的最大值和最小值一起筛选出来,同时保留2A对应的5A
SELECT * FROM `001copy` WHERE `2A` = (SELECT MAX(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=04 )
or `2A` = (SELECT MIN(`2A`) FROM `001copy` WHERE YEAR(5A)=2019 AND MONTH(5A)=04);
如果2A同时取最大值和最小值不方便,也可以将2A复制到2A_1,一个筛选最大值一个筛选最小值,只要保住数据和数据对应的日期能同时筛选出来。
谢谢,不过好像还是不行,因为是要筛选出每个月的最大值和最小值。10年内120个月,每个月的最大值和最小值。[/quote]
修改成月份的了。
SELECT DATE_FORMAT(T.5A,'%Y-%m') 月份,MAX(T.2A) 最大值,MIN(T.2A) 最小值 FROM 001copy T WHERE T.5A >= ? AND T.5A <= ? GROUP BY DATE_FORMAT(T.5A,'%Y-%m') ;[/quote]
谢谢,已经帮忙很多,要是将最大值和最小值对应的时间点也查询出来,应该怎么办?