如何解决绕过only_full_group_by限制
我有这个简单的表:
mysql> select deviceId,eventName,loggedAt from foo;
+----------+------------+---------------------+
| deviceId | eventName | loggedAt |
+----------+------------+---------------------+
| 1 | foo | 2020-09-18 21:27:21 |
| 1 | bar | 2020-09-18 21:27:26 |
| 1 | last event | 2020-09-18 21:27:43 | <--
| 2 | xyz | 2020-09-18 21:27:37 |
| 2 | last event | 2020-09-18 21:27:55 | <--
| 3 | last one | 2020-09-18 21:28:04 | <--
+----------+------------+---------------------+
,我想选择每个deviceId
中最近的loggedAt
行。为了清楚起见,我在上表中用箭头标记了这些行。
如果我在上述查询中附加 group by id
,我会臭名昭著:
SELECT列表的表达式#2不在GROUP BY子句中,并且包含非聚合列'foo.eventName',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by
不兼容
并且我不想更改sql_mode
。
我已经很接近我想要使用的了:
select deviceId,any_value(eventName),max(loggedAt) from foo group by deviceId;
但是显然any_value
返回一个随机结果。
我该如何解决?
解决方法
ONLY_FULL_GROUP_BY
是一件好事:它执行基本的SQL标准规则,关于MySQL长期以来松懈的规则。即使禁用它,您也将获得与any_value()
相同的结果。
您遇到了前1个组的问题,您无法在 entire行中显示每个设备的最新日期。聚合不是实现此目的的正确工具,您需要的是过滤数据集。
一个选项使用相关的子查询:
select f.*
from foo f
where f.loggedat = (
select max(f1.loggedate) from foo where f1.deviceid = f.deviceid
)
在MySQL 8.0中,您也可以使用row_number()
:
select *
from (
select f.*,row_number() over(partition by deviceid order by loggedat desc) rn
from foo f
) f
where rn = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。