2016-09-27 38 views
0

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

我的表是建立一个类似下面...

+-------+------------+------+------+------+ 
| 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) 

这让我每一天在一月,这是很好的最大...但我需要在它发生的日期。出于某种原因,我得到的是1899年。

例如在1月31日...最大(thi)是93但它发生在1911-01-31。也有多少年可能发生最大(th)。在1月30日...最大(thi)是86发生在1906-01-30和1994-01-30。

有没有办法在MySQL中做到这一点,或者我只是运气不好?提前致谢!

回答

2

在SELECT中返回date表达式的值不确定。 MySQL可以自由地从组中的任何行返回date值。 (其他数据库会在此查询中引发错误,特定于MySQL的MySQL扩展允许查询运行,但是我们可以让MySQL更加紧密地符合SQL标准,并通过将ONLY_FULL_GROUP_BY包含在sql_mode。)

你有一个好的开始。

  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值。

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

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 

如果您想返回所有年份对于给定的月日的最高THI发生,除去GROUP BY子句,并从各地t.date

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 

骨料作为另一个备选方案,以得到最早发生的日期,可以在SELECT列表中使用相关的子查询:

SELECT DATE_FORMAT(n.date,'%m%d') AS mmdd 
     , MAX(n.thi) AS thi 
     , (SELECT t.date 
      FROM dfw t 
      WHERE DATE_FORMAT(t.date,'%m%d') = DATE_FORMAT(n.date,'%m%d') 
      AND t.thi = n.thi 
      ORDER BY t.date 
      LIMIT 0,1 
     ) AS earliest_date 
    FROM dfw n 
    GROUP BY DATE_FORMAT(n.date,'%m%d') 
    ORDER BY DATE_FORMAT(n.date,'%m%d') 
+0

非常感谢!这真的有帮助!仍尝试学习一点,但我真的很感谢帮助! –