我有这个简单的表:
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 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“foo.eventName”;这与 sql_mode=only_full_group_by 不兼容
而且我不想更改sql_mode
.
我已经非常接近我想要使用的东西:
select deviceId, any_value(eventName), max(loggedAt) from foo group by deviceId;
但显然any_value
返回一个随机结果。
我该如何解决这个问题?