在MySQL中查找多年中每个月中每天的MAX值

时间:2016-09-27 00:28:16

标签: mysql date

我有一个充满天气数据的数据库...特别是日期,最高温度,最低温度和每日降雨量超过100年。我试图找出每天的最高温度以及它在整个100多年中发生的具体日期。

我的表格设置类似于以下...

+-------+------------+------+------+------+
| id    | date       | thi  | tlo  | rain |
+-------+------------+------+------+------+
| 42856 | 2016-01-01 |   49 |   39 | 0.00 |
| 42857 | 2016-01-02 |   51 |   38 | 0.00 |
| 42858 | 2016-01-03 |   60 |   37 | 0.00 |
| 42859 | 2016-01-04 |   54 |   32 | 0.00 |
| 42860 | 2016-01-05 |   47 |   32 | 0.00 |
+-------+------------+------+------+------+
5 rows in set (0.01 sec)

我想找到一年中每一天的最大值(thi)以及它发生的日期。这个数据可以追溯到1899年,因此数据库中有1月份的117个,依此类推。

到目前为止,我已经提出了以下内容......

select date, max(thi),
-> DAY(date)
-> from dfw where MONTH(date)='01'
-> group by DAY(date);
+------------+----------+-----------+
| date       | max(thi) | DAY(date) |
+------------+----------+-----------+
| 1899-01-01 |       83 |         1 |
| 1899-01-02 |       78 |         2 |
| 1899-01-03 |       84 |         3 |
| 1899-01-04 |       81 |         4 |
| 1899-01-05 |       82 |         5 |
| 1899-01-06 |       79 |         6 |
| 1899-01-07 |       83 |         7 |
| 1899-01-08 |       88 |         8 |
| 1899-01-09 |       82 |         9 |
| 1899-01-10 |       79 |        10 |
| 1899-01-11 |       83 |        11 |
| 1899-01-12 |       82 |        12 |
| 1899-01-13 |       78 |        13 |
| 1899-01-14 |       79 |        14 |
| 1899-01-15 |       80 |        15 |
| 1899-01-16 |       81 |        16 |
| 1899-01-17 |       79 |        17 |
| 1899-01-18 |       80 |        18 |
| 1899-01-19 |       84 |        19 |
| 1899-01-20 |       83 |        20 |
| 1899-01-21 |       79 |        21 |
| 1899-01-22 |       85 |        22 |
| 1899-01-23 |       88 |        23 |
| 1899-01-24 |       82 |        24 |
| 1899-01-25 |       84 |        25 |
| 1899-01-26 |       82 |        26 |
| 1899-01-27 |       81 |        27 |
| 1899-01-28 |       85 |        28 |
| 1899-01-29 |       84 |        29 |
| 1899-01-30 |       86 |        30 |
| 1899-01-31 |       93 |        31 |
+------------+----------+-----------+
31 rows in set (0.01 sec)

这给了我1月份每天的最大值,这是好的......但我需要它发生的日期。出于某种原因,我得到的只是1899年。

例如1月31日......最大值(thi)为93,但发生在1911-01-31。有时候max(thi)可能在多年内发生。 1月30日......最大(thi)是86,发生在1906-01-30和1994-01-30。

有没有办法在MySQL中执行此操作,或者我只是运气不好?提前谢谢!

1 个答案:

答案 0 :(得分:2)

SELECT中button表达式返回的值是不确定的。 MySQL可以从组中的任何行返回date值。 (其他数据库会在此查询中引发错误.GROUP BY的MySQL特定扩展允许查询运行,但是我们可以使MySQL更接近符合SQL标准,并通过在ONLY_FULL_GROUP_BY中包含ONLY_FULL_GROUP_BY而在此查询中引发错误的sql_mode。)

你有一个良好的开端。

date

为了获得这一年,有几种方法。一种是将查询用作内联视图,并连接到原始表以查找匹配的行,一个具有相同的月和日,以及相同的thi值。

您可以使用MAX()或MIN()聚合来获取最新或最早的日期。

          SELECT DATE_FORMAT(n.date,'%m%d') AS mmdd 
               , MAX(n.thi) AS max_thi
            FROM dfw
           GROUP BY DATE_FORMAT(n.date,'%m%d')   

如果要返回发生最高thi的给定mmdd的所有年份,请删除GROUP BY子句和t.date周围的聚合

 SELECT m.mmdd
      , m.thi
      , MAX(t.date)  AS latest_date
      , MIN(t.date)  AS earliest_date
   FROM ( 
          SELECT DATE_FORMAT(n.date,'%m%d') AS mmdd 
               , MAX(n.thi) AS thi
            FROM dfw
           GROUP BY DATE_FORMAT(n.date,'%m%d')   
        ) m
  JOIN dfw t
    ON t.thi                      = m.thi
   AND DATE_FORMAT(t.date,'%m%d') = m.mmdd  
 GROUP BY m.mmdd
 ORDER BY m.mmdd

作为另一种选择,要获得最早发生的日期,您可以在SELECT列表中使用相关子查询:

 SELECT m.mmdd
      , m.thi
      , t.date
   FROM ( 
          SELECT DATE_FORMAT(n.date,'%m%d') AS mmdd 
               , MAX(n.thi) AS thi
            FROM dfw
           GROUP BY DATE_FORMAT(n.date,'%m%d')   
        ) m
  JOIN dfw t
    ON t.thi                      = m.thi
   AND DATE_FORMAT(t.date,'%m%d') = m.mmdd  
 ORDER BY m.mmdd, t.date