挑战在于从表格中选择每日最高温度以及每个日期和时间信息。
SELECT datestamp, max(temp) hitemp from Weather w group by `year`, `month`, `day`;
这引起
SELECT列表的表达式#1不在GROUP BY子句中,包含
非汇总列“ Weather.datestamp”,不是
功能上取决于GROUP BY子句中的列;这是
与sql_mode = only_full_group_by不兼容
其他类似的问题建议使用JOIN,但我看不到如何使用JOIN语法,因为高温值不是唯一的。
最佳答案
RDBMS在基于集合的逻辑上效果最好。因此,请从以下两个方面来考虑数据:
w2:一组包含给定日期的最高温度的数据
w:一段时间内包含所有测量值的数据范围
通过将这两个集合相结合,我们可以仅从w中获得给定日期具有最高温度的数据。
通过使用针对整个Universe集{w}的内联视图{w2},我们可以生成每天的最高温度,然后重新加入基本集{w}以获取每天最高温度的时间信息。
这假定:
如果同一日期的多个记录上都存在最高温度,则您希望全部保留它们,因为您没有指出如何处理联系。
datestamp具有时间分量;这是您要在一天中看到的最高温度的日期/时间。
这是其他人最有可能表示的意思:
date(datestamp)仅返回日期/时间的日期部分。
max()返回表示的组的最高温度(在这种情况下为datestamp的日期)
。
SELECT datestamp, Temp
FROM weather W
INNER JOIN (SELECT date(datestamp) mDate, max(temp) as mtemp
FROM weather
GROUP BY Date(DateStamp)) W2
on W.temp = W2.mtemp
and Date(w.Datestamp) = w2.mDate
附加信息:
MySQL不支持
cross apply
也不支持解析函数row_number() Over (partition by date(datestamp) order by temp desc)
,解析函数也可以用于解决此问题,并且可能会提高性能。 SQL Server,Oracle,DB2和Postgresql都有解决此问题的不同方法。但是,上面的示例适用于所有RDBMS引擎(我可以想到);但并非在所有情况下都是最有效的。