mysql - groupwise max 导致 sql_mode 错误

标签 mysql

挑战是从表格中选择每日最高温度以及每个温度的日期和时间信息。

SELECT datestamp, max(temp) hitemp from Weather w group by `year`, `month`, `day`;

这会导致

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'Weather.datestamp' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

其他类似的问题建议使用 JOIN,但我不知道如何使用 JOIN 语法,因为高温值不是唯一的。

最佳答案

RDBMS 在基于集合的逻辑上工作得最好。因此,请考虑两组数据:

  • w2:包含给定日期最高温度的一组数据
  • w:包含一段时间内所有测量值的数据域

通过连接这两个集合,我们可以从 w 中获取特定日期最高温度的数据。

通过对整个宇宙集 {w} 使用内联 View {w2},我们可以生成每天的最高温度,然后连接回基本集 {w} 以获取每天最高温度的时间信息。

这假设:

  • 如果同一日期的多个记录都有最高温度,您需要全部记录,因为您没有指明如何处理关系。
  • datestamp 有一个时间部分;这是您想要查看一天最高温度的日期/时间。

这就是其他人所说的加入最有可能的意思:

  • date(datestamp) 仅返回日期/时间的日期部分。
  • max() 返回指定组的最高温度(在本例中为日期戳的日期)

.

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 引擎(我能想到的);但并不是在所有情况下都是最有效的。

关于mysql - groupwise max 导致 sql_mode 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45486552/

相关文章:

PHP 多维数组返回空子数组

php - 如何在 php-mysql 中记录页面的所有更新

mysql - CI : Querying two tables in the model, explode

java - noob,java spring autowired hibernate mysql 查询,这是对的吗?

php - echo 两个表问题需要发布两次(mysql,php)

mysql - 半随机顺序

mysql - 如果到达最后一行,则从第一行返回

mysql - 将 JDBC 引用保留在 web.xml 之外以部署在 Jetty 中,就像在 tomcat 中一样

php - 更改 ShareJS 中的默认文本

javascript - MySQL 日期到 Javascript 日期