sql - 按功能分组的当前记录
问题描述
试图获取 session_id 的用户 ID 最近的聚合值。
(session_id 3 有两条记录,最近 agg 值为 80.00 session_id 4 有 4 条记录,最近 agg 值为 95.00 session_id 6 有 3 条记录,最近 agg 值为 72.00
表:session_agg
id session_id userid agg date
-- ---------- ------ ----- -------
1 3 11 60.00 1573561586
4 3 11 80.00 1573561586
6 4 11 35.00 1573561749
7 4 11 50.00 1573561751
8 4 11 70.00 1573561912
10 4 11 95.00 1573561921
11 6 14 40.00 1573561945
12 6 14 67.00 1573561967
13 6 14 72.00 1573561978
select id, session_id, userid, agg, date from session_agg
WHERE date IN (select MAX(date) from session_agg GROUP BY session_id) AND
userid = 11
解决方案
如果您想坚持当前的方法,那么您需要session_id
在子查询中关联检查每个会话的最大日期:
SELECT id, session_id, userid, add, date
FROM session_agg sa1
WHERE
date = (SELECT MAX(date) FROM session_agg sa2 WHERE sa2.session_id = sa1.session_id) AND
userid = 11;
但是,如果您的 SQL 版本支持分析函数,ROW_NUMBER
则更简单的方法是:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY date DESC) rn
FROM session_agg
)
SELECT id, session_id, userid, add, date
FROM cte
WHERE rn = 1;
推荐阅读
- php - 使用不同 ID 分隔数据 - mysql 或 phpexcel
- postgresql - Postgres 9.5 表复制
- html - 如何以角度切换单选按钮?
- mysql - 优化查询——mysql
- sockets - 如何在服务器侦听 udp:0.0.0.0:port 时从服务器端获取客户端的远程(目标)地址?
- javascript - 没有 JavaScript 响应
- python - 如何让 cmap 在三个 for 循环中以可迭代的方式工作?
- babeljs - Babel 插件:“transform-object-rest-spread”和“syntax-object-rest-spread”有什么区别
- kotlin - IntRange 对象如何访问 Iterator 函数,例如 forEach?
- javascript - Google Script Container boundscript onEdit 共享它会覆盖文件