2016-09-27 2 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) 

내가 올해의 매일과가 발생한 날짜에 대한 최대 (생)을 찾으려면 ... 아래에 비슷한 설정됩니다. 이 데이터는 1899 년으로 거슬러 올라가서 1 월 117 일이 데이터베이스에 있고, 매년 1 년이됩니다.

내가 가지고 올 한이 나에게 좋은 월 매일 최대를 제공합니다 ...하지만 난이 발생한 날짜를 필요

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에서 발생했습니다. 또한 max (thi)가 여러 해 동안 발생할 수있는 시간이 있습니다. 1 월 30 일에 max (thi)는 1906-01-30과 1994-01-30에 발생한 86입니다.

MySQL에서이 작업을 수행 할 수있는 방법이 있습니까? 아니면 운이 좋을까요? 미리 감사드립니다!

답변

2

SELECT에서 date 표현식에 대해 반환 된 값은 불확정합니다. MySQL은 그룹의 모든 행에서 date 값을 반환 할 수 있습니다. (다른 데이터베이스는이 쿼리에서 에러를 던질 것입니다.) GROUP BY에 대한 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') 

올해를 보려면 몇 가지 방법이 있습니다. 하나는 쿼리를 인라인보기로 사용하고 원래 테이블에 조인하여 일치하는 행을 찾고, 같은 달과 요일 및 동일한 값을 갖는 행을 찾습니다.

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 

주어진에 대한 모든 년 반환 할 경우

가장 높은 생이 발생 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 

각국에서 총에 있음을 MMDD 가장 먼저 발생한 날짜를 가져 오려면 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

고맙습니다. 정말 도움이됩니다! 아직도 조금 배우려고 노력하지만 도움을 정말 감사드립니다! –

관련 문제