一张表001copy,10年内每天的数据都有,现在想筛选出每个月的最大值和最小值,字段有id,2A(存贮着数据),5A(日期),不知道该怎么写。
本人想出的方法是筛选出每个月的最大值和最小值建立一个新表,然后将这些新表合并成一个表,但是太麻烦了,10年共120个月,实在想不出什么好方法了,有没有高手给些意见,本人小白。

解决方案 »

  1.   

    SELECT  T.5A 日期,MAX(T.2A) 最大值,MIN(T.2A) 最小值 FROM 001copy T WHERE T.5A >= ? AND T.5A <= ? GROUP BY T.5A ;
      

  2.   

    谢谢,不过好像还是不行,因为是要筛选出每个月的最大值和最小值。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') ;
      

  3.   

    谢谢,不过好像还是不行,因为是要筛选出每个月的最大值和最小值。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') ;
    谢谢,已经帮忙很多,要是将最大值和最小值对应的时间点也查询出来,应该怎么办?
      

  4.   

    不要意思,因为本人是小白,所以问题可能幼稚了,只是个人想得到这样的结果而已,每月的最大值和最小值能被筛选出,同时最大值和最小值对应的时间也能同步筛选出。
    那能不能将数据存贮的2A复制成2A_1,然后2A筛选最大值,2A_1筛选最小值,5A是日期保持不变。
      

  5.   

    能不能将数据存贮的2A复制成2A_1,然后2A筛选最大值,2A_1筛选最小值,5A是日期保持不变。
    最终的结果像这样展示。
      

  6.   

    按照您的要求,直接执行这个语句即可。
    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 ;
      

  7.   

    表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,一个筛选最大值一个筛选最小值,只要保住数据和数据对应的日期能同时筛选出来。
      

  8.   

    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.最小值)
      

  9.   

    谢谢诸位的帮忙和提示,用了两个方案,都不完美,第一个是非常笨的方法。
     (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)
    ……
    这样一直下去,非常的长,然后能选出自己想要的结果。
    (其实结果也不完美,还是多了两条数据,有两个年份的某月最大值和最小值合在一起有三个,但是查看语句却没发现有多余的最大或最小值信息,后来在查询出来的结果中慢慢排查才解决了问题,到底是什么原因就不知道了。)
      

  10.   

    如果是纯粹的sql语句:事实上不建议这么做。select  xx数据,日期函数(这条数据的日期 转换成月份) from 这个表 where ???有点像
    1   201801
    2   201801
    3  。select  from (select  xx数据,日期函数(这条数据的日期 转换成月份) 日期 from 这个表 where ???)
    group by 日期
      

  11.   

    另外一种方法有瑕疵。两张表一模一样,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字段中数据重复就麻烦了。得出的结果就不够准了。
      

  12.   

    谢谢提醒,原始状态是这样的,表名001copy,字段id、2A(数据)、5A(日期),如下图:5A(日期)从2019年4月19日往下,一直到2000年1月4日,2A(数据)是5A(日期)对应日期的数据,id是自动增加。
    现在的需求是查询2A(数据)每个月的最大值和最小值,同时最大值和最小值对应的5A(日期)也要显示出来。如下图:(1、id和日期都是唯一性,所以哪一个被查询出来都可以。)
    (2、如果不能同时显示最大值和最小值,先查询最大值再查询最小值也是可以。)
      

  13.   

    方法已经找到,谢谢众位的帮忙。
    将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 ;
    具体逻辑是什么。我也说不清,但是的确解决了问题,我一一核对了一下,没有问题。
    如果有大神不嫌弃,可以帮我们普及一下原理。谢谢。
      

  14.   

    你这个正确只是结果表面上的正确,如果 WHERE T.2A=M.2A OR T.2A=M.21A  这个条件查出来有多条数据(即有数据相同的情况),你这个就是错误的。
      

  15.   

    你这个正确只是结果表面上的正确,如果 WHERE T.2A=M.2A OR T.2A=M.21A  这个条件查出来有多条数据(即有数据相同的情况),你这个就是错误的。

    是有这样的问题,还没想到好方法解决,(不过,本次数据的查询,即使有相同的,只要一个就ok)