mysql - Mysql group by 聚合排序和限制
问题描述
我试图找出一个看似微不足道的 SQL 查询。对于表中的所有用户,我想找到时间最长的行(最新事件)的时间和数据。
以下几乎解决了它
SELECT user, MAX(time) as time FROM tasks GROUP BY user;
问题当然是data
不能减少列。我认为因此我应该使用 WHERE 或 ORDER BY + LIMIT 结构。但是我离我的领域太远了,不知道应该如何正确完成。有什么提示吗?
笔记。在这种情况下无法使用 GROUP BY,因为我想在表行 ID 上进行选择,显然无法聚合。
-- MYSQL
DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
USE test;
CREATE TABLE tasks (
id int AUTO_INCREMENT,
user varchar(100) NOT NULL,
time date NOT NULL,
data varchar(100) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO tasks (user, time, data) VALUES
("Kalle", "1970-01-01", "old news"),
("Kalle", "2020-01-01", "latest shit"),
("Pelle", "1970-01-01", "regular data");
-- Expected output
-- +----+-------+------------+--------------+
-- | id | user | time | data |
-- +----+-------+------------+--------------+
-- | 2 | Kalle | 2020-01-01 | latest shit |
-- | 3 | Pelle | 1970-01-01 | regular data |
-- +----+-------+------------+--------------+
-- 2 rows in set (0.00 sec)
解决方案
您可以使用子查询进行过滤:
select t.*
from tasks t
where time = (select max(t1.time) from tasks t1 where t1.user = t.user)
此查询将利用(user, time)
.
在 MySQL 8.0 中,您还可以使用窗口函数解决此 top-1-per-group:
select *
from (select t.*, row_number() over(partition by user order by time desc) rn from tasks t) t
where rn = 1
推荐阅读
- python - 如何在 python 中检测来自 png 的某些像素的 rgb 值?
- python - 在使用 pydevd 之前如何检查调试器是否正在运行?
- python - AWS Lambda 在超时的情况下重试,即使重试尝试设置为 0
- scala - NoClassDefFoundError: scala/Product$class 在本地的 scala 代码中调用 aws-glue 库。同一个罐子可以作为 aws 上的胶水工作
- google-cloud-storage - 使用 Java 从 Google 云存储中读取非常大的文件
- flutter - 错误:不支持的操作:使用 image_picker 时的 _Namespace
- excel - Oracle APEX 中受密码保护的 excel 文件
- reactjs - Babel + Webpack 打破了 es6 的导入
- c - 为什么在 while 循环条件中将 getchar() 分配给变量会导致输出为 0?
- c++ - 在 Windows 上用 C++ 监控某个进程的有效方法