You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询每个用户首次参与的赛事?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:40:04