2016-09-27 36 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

非常感謝!這真的有幫助!仍嘗試學習一點,但我真的很感謝幫助! –