如何用SQL查询数据库表中指定PersonID第二次出现的对应行记录
方案1:窗口函数实现(兼容性好,支持MySQL 8.0+/PostgreSQL/SQL Server等所有主流新版数据库)
思路是先给同一个personID下的所有记录按出现时间排序编号,再筛选编号为2的目标记录即可,SQL语句如下:
-- 先给同personID的记录按时间升序排序编号 WITH ranked_seen AS ( SELECT seenID, personID, seenTime, ROW_NUMBER() OVER (PARTITION BY personID ORDER BY seenTime ASC, seenID ASC) AS row_num FROM 你的表名 -- 替换为你实际的表名 ) -- 筛选personID为3的第2条记录 SELECT seenID, personID, seenTime FROM ranked_seen WHERE personID = 3 AND row_num = 2;
补充说明:排序规则里额外加了
seenID排序,是为了避免出现两条记录seenTime完全一致时,排序结果不稳定的问题,如果你的业务场景里seenTime不会重复,可以去掉这个排序条件。
方案2:老版本MySQL兼容写法(不支持窗口函数/CTE的场景)
可以直接用LIMIT偏移取值,跳过第一条记录取1条即可:
SELECT seenID, personID, seenTime FROM 你的表名 WHERE personID = 3 ORDER BY seenTime ASC, seenID ASC LIMIT 1,1; -- 第一个参数是偏移量(跳过1条),第二个参数是返回条数
如果需要适配其他数据库或者有特殊排序规则,调整ORDER BY后的排序字段即可。
内容的提问来源于stack exchange,提问作者prathik vijaykumar
相关产品推荐
相关产品推荐

