如何查询每个用户首次参与的赛事?SQL分组查询现重复用户问题求助
解决每个用户首次参与赛事的查询问题
你原来的SQL之所以会出现用户重复,是因为同时按user_id和tournament_id分组——这会把同一个用户注册的每一场赛事都单独分成一组,自然会返回多条同一个用户的记录,完全不符合你要「每个用户仅返回首次参与赛事」的需求。
下面是两种可行的解决方案:
方法一:子查询+关联匹配
先通过子查询找出每个用户的最早注册时间,再关联原表拿到对应的赛事ID:
SELECT ps.user_id, ps.created_at AS first_participation_date, ps.tournament_id FROM participant_status ps INNER JOIN ( -- 先获取每个用户的最早注册时间 SELECT user_id, MIN(created_at) AS earliest_time FROM participant_status GROUP BY user_id ) user_earliest ON ps.user_id = user_earliest.user_id AND ps.created_at = user_earliest.earliest_time;
注意:如果存在同一个用户在同一时间注册多场赛事的情况,这个查询会返回该用户的多条记录。如果需要强制只返回一条,可以在SELECT后加上DISTINCT。
方法二:窗口函数(推荐)
用ROW_NUMBER()窗口函数给每个用户的注册记录按时间排序,取排序后的第一条:
SELECT user_id, created_at AS first_participation_date, tournament_id FROM ( SELECT user_id, tournament_id, created_at, -- 按用户分组,注册时间升序排序,生成行号 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row_num FROM participant_status ) ranked_records WHERE row_num = 1;
如果想保留用户同一时间注册的所有赛事(比如用户同时报了两场最早的赛事),可以把ROW_NUMBER()换成RANK(),这样同时间的记录行号都是1,都会被保留。
内容的提问来源于stack exchange,提问作者kimammi
相关产品推荐
相关产品推荐

