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