如何查询所有用户的最新分数?现有SQL查询报错求替代方案
获取所有用户最新分数的正确SQL查询方式
原语句select distinct user_id, score from user_score order by created_at desc的问题在于:
distinct仅对user_id和score的组合去重,无法确保拿到每个用户最新创建时间对应的分数- 部分数据库(如开启
ONLY_FULL_GROUP_BY的MySQL)会因order by字段不在select的去重列表中直接报错
以下是两种通用的正确查询方式:
方法1:窗口函数法(适用于MySQL 8+、PostgreSQL、SQL Server等)
SELECT user_id, score FROM ( SELECT user_id, score, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn FROM user_score ) t WHERE rn = 1;
- 逻辑:按
user_id分组,组内按created_at倒序排序,用ROW_NUMBER()给每条记录编号,取编号为1的记录就是该用户的最新分数 - 注意:若同一用户同一时间有多条分数记录,此方法仅返回其中一条;若需保留所有同时间的最新分数,可将
ROW_NUMBER()替换为RANK()
方法2:关联子查询法(兼容大部分低版本数据库)
SELECT us.user_id, us.score FROM user_score us WHERE us.created_at = ( SELECT MAX(created_at) FROM user_score WHERE user_id = us.user_id );
- 逻辑:子查询先获取每个用户的最新创建时间,再关联主表拿到该时间对应的分数
- 注意:若同一用户同一时间有多条分数记录,此方法会返回所有符合条件的记录
内容的提问来源于stack exchange,提问作者Akash Jain
相关产品推荐
相关产品推荐

