首页 > 解决方案 > 按功能分组的当前记录

问题描述

试图获取 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 

标签: sql

解决方案


如果您想坚持当前的方法,那么您需要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;

推荐阅读