SQL如何查询数据表中每个用户分组对应的第二条记录
实现方案
如果你的数据库支持窗口函数(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等主流版本都支持),优先使用ROW_NUMBER()窗口函数实现,逻辑清晰性能也更好:
WITH ranked_records AS ( SELECT id, user_id, value, -- 按user_id分组,组内按id升序排序生成行号 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id ASC) AS row_num FROM 你的实际表名 ) -- 筛选每个分组内行号为2的记录,就是对应user_id的第二条 SELECT id, user_id, value FROM ranked_records WHERE row_num = 2;
如果是旧版本不支持窗口函数的场景(比如MySQL 5.7及更早版本),可以用关联子查询实现:
SELECT t1.id, t1.user_id, t1.value FROM 你的实际表名 t1 WHERE ( SELECT COUNT(*) FROM 你的实际表名 t2 WHERE t2.user_id = t1.user_id AND t2.id <= t1.id ) = 2;
注意:以上两种写法默认你说的「第二条」是按id从小到大排序的第二条,如果你的排序规则不是id,把
ORDER BY id ASC里的id换成对应排序字段即可。另外只有1条记录的user_id(比如示例里的user_id=3)会自然被过滤,和你给出的预期结果一致。
内容的提问来源于stack exchange,提问作者PrintScreenSys
相关产品推荐
相关产品推荐

