我有一个充满天气数据的数据库...特别是日期,最高温度,最低温度和每日降雨量超过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中执行此操作,或者我只是运气不好?提前谢谢!
答案 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