一张表001copy,10年内每天的数据都有,现在想筛选出每个月的最大值和最小值,字段有id,2A(存贮着数据),5A(日期),不知道该怎么写。
本人想出的方法是筛选出每个月的最大值和最小值建立一个新表,然后将这些新表合并成一个表,但是太麻烦了,10年共120个月,实在想不出什么好方法了,有没有高手给些意见,本人小白。
本人想出的方法是筛选出每个月的最大值和最小值建立一个新表,然后将这些新表合并成一个表,但是太麻烦了,10年共120个月,实在想不出什么好方法了,有没有高手给些意见,本人小白。
修改成月份的了。
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') ;
修改成月份的了。
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') ;
谢谢,已经帮忙很多,要是将最大值和最小值对应的时间点也查询出来,应该怎么办?
那能不能将数据存贮的2A复制成2A_1,然后2A筛选最大值,2A_1筛选最小值,5A是日期保持不变。
最终的结果像这样展示。
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 ;
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,一个筛选最大值一个筛选最小值,只要保住数据和数据对应的日期能同时筛选出来。
(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)
……
这样一直下去,非常的长,然后能选出自己想要的结果。
(其实结果也不完美,还是多了两条数据,有两个年份的某月最大值和最小值合在一起有三个,但是查看语句却没发现有多余的最大或最小值信息,后来在查询出来的结果中慢慢排查才解决了问题,到底是什么原因就不知道了。)
1 201801
2 201801
3 。select from (select xx数据,日期函数(这条数据的日期 转换成月份) 日期 from 这个表 where ???)
group by 日期
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字段中数据重复就麻烦了。得出的结果就不够准了。
现在的需求是查询2A(数据)每个月的最大值和最小值,同时最大值和最小值对应的5A(日期)也要显示出来。如下图:(1、id和日期都是唯一性,所以哪一个被查询出来都可以。)
(2、如果不能同时显示最大值和最小值,先查询最大值再查询最小值也是可以。)
将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 ;
具体逻辑是什么。我也说不清,但是的确解决了问题,我一一核对了一下,没有问题。
如果有大神不嫌弃,可以帮我们普及一下原理。谢谢。
是有这样的问题,还没想到好方法解决,(不过,本次数据的查询,即使有相同的,只要一个就ok)