如何获取每个用户对应最新Timestamp的Rating数据?
获取用户最新Rating数据的解决方案
原始数据
+--------+-----------+--------+ | UserId | Timestamp | Rating | +--------+-----------+--------+ | 1 | 1 | 1202 | | 2 | 1 | 1198 | | 1 | 2 | 1204 | | 2 | 2 | 1196 | | 1 | 3 | 1206 | | 2 | 3 | 1194 | | 1 | 4 | 1198 | | 2 | 4 | 1202 | +--------+-----------+--------+
需求目标
提取每个用户最新(Timestamp值最大)的Rating数据,最终结果格式如下:
+--------+--------+ | UserId | Rating | +--------+--------+ | 1 | 1198 | | 2 | 1202 | +--------+--------+
可行解决方案
不用纠结LIMIT的常量限制,直接用以下两种更高效的方式获取目标数据:
方法1:窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数给每个用户的记录按时间戳降序编号,筛选编号为1的行即可:
SELECT UserId, Rating FROM ( SELECT UserId, Rating, -- 按用户分组,组内按时间戳降序标序号 ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Timestamp DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
方法2:子查询关联(兼容旧版本数据库)
先获取每个用户的最大时间戳,再关联原表匹配对应评分:
SELECT t1.UserId, t1.Rating FROM your_table_name t1 JOIN ( -- 先找出每个用户的最新时间戳 SELECT UserId, MAX(Timestamp) AS max_ts FROM your_table_name GROUP BY UserId ) t2 ON t1.UserId = t2.UserId AND t1.Timestamp = t2.max_ts;
内容的提问来源于stack exchange,提问作者hugeandy
相关产品推荐
相关产品推荐

