Mysql 通过限制绕过唯一的\u满\u组\u
我有一张简单的桌子:Mysql 通过限制绕过唯一的\u满\u组\u,mysql,sql,group-by,greatest-n-per-group,sql-mode,Mysql,Sql,Group By,Greatest N Per Group,Sql Mode,我有一张简单的桌子: mysql> select deviceId, eventName, loggedAt from foo; +----------+------------+---------------------+ | deviceId | eventName | loggedAt | +----------+------------+---------------------+ | 1 | foo | 2020-09-18 2
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 | <--
+----------+------------+---------------------+
但是显然,any_值
返回一个随机结果
我该如何解决这个问题呢?
只有
才是一件好事:它强制执行基本的SQL标准规则,MySQL长期以来一直对这些规则松懈。即使禁用它,也会得到与使用any_value()
得到的结果相同的结果
您有一个按组排名前1位的问题,无法显示每台设备最近日期的整行。聚合不是用于此目的的合适工具,您需要的是过滤数据集
一个选项使用相关子查询:
select f.*
from foo f
where f.loggedat = (
select max(f1.loggedate) from foo where f1.deviceid = f.deviceid
)
在MySQL 8.0中,您还可以使用行数()
ONLY_FULL_GROUP_BY
是一件好事:它强制执行基本的SQL标准规则,MySQL长期以来一直对此松懈。即使禁用它,也会得到与使用any_value()
得到的结果相同的结果
您有一个按组排名前1位的问题,无法显示每台设备最近日期的整行。聚合不是用于此目的的合适工具,您需要的是过滤数据集
一个选项使用相关子查询:
select f.*
from foo f
where f.loggedat = (
select max(f1.loggedate) from foo where f1.deviceid = f.deviceid
)
在MySQL 8.0中,您还可以使用行数()
您的MySQL版本是什么?@Akina:8,但我认为这适用于5.7及更高版本。从foo中选择不同的设备ID,第一个值(eventName)超过(PARTITON BY deviceId ORDER BY loggedAt DESC),最大值(loggedAt)超过(PARTITON BY deviceId)代码>。仅适用于8+版本。您的MySQL版本是什么?@Akina:8,但我认为这适用于5.7及更高版本。从foo中选择不同的设备ID,第一个值(eventName)超过(partton BY deviceId ORDER BY loggedAt DESC),最大值(loggedAt)超过(partton BY deviceId)代码>。仅适用于8+用户。
select *
from (
select f.*, row_number() over(partition by deviceid order by loggedat desc) rn
from foo f
) f
where rn = 1