SQLite3如何查询每个userid分组的最后一条记录
实现思路(SQLite3)
假设你的表名为scores,以下是几种可行的实现方式:
方法一:子查询+关联查询
先通过子查询找出每个userid对应的最大id,再将这个结果和原表关联,获取对应的score信息:
SELECT s.id, s.userid, s.score FROM scores s JOIN ( SELECT userid, MAX(id) AS max_id FROM scores GROUP BY userid ) t ON s.id = t.max_id AND s.userid = t.userid;
原理:先分组统计每个用户的最大id(因为id递增,最大id就是最后一条记录),再通过id和userid匹配原表数据,拿到完整记录。
方法二:窗口函数(SQLite3.25.0+)
如果你的SQLite版本在3.25.0及以上,可以用ROW_NUMBER()窗口函数,给每个用户的记录按id倒序编号,取编号为1的那条:
SELECT id, userid, score FROM ( SELECT id, userid, score, ROW_NUMBER() OVER (PARTITION BY userid ORDER BY id DESC) AS rn FROM scores ) t WHERE rn = 1;
原理:PARTITION BY userid按用户分组,ORDER BY id DESC让每组内id大的排在前面,ROW_NUMBER()给每组记录编号,取rn=1就是每组最后一条。
方法三:NOT EXISTS 子查询
通过判断当前记录是否是该用户的最大id记录(即不存在同用户且id更大的记录):
SELECT id, userid, score FROM scores s WHERE NOT EXISTS ( SELECT 1 FROM scores t WHERE t.userid = s.userid AND t.id > s.id );
原理:对每条记录,检查是否有同用户的更大id记录,没有的话就是该用户的最后一条。
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

