postgresql 根据行动日期查找用户的第一个锦标赛

t1qtbnec  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(2)|浏览(95)

我有一个表,其中包括每个注册用户已经完成的比赛。这个表可以有一个用户注册许多比赛随着时间的推移。
它由user_id、tournament_id和created_at日期字段组成
我需要看到每个用户的第一场比赛。
我尝试了以下方法:

SELECT user_id, MIN(created_at) AS first_participation_date, tournament_id
FROM participant_status
GROUP BY user_id, tournament_id
ORDER BY user_id, first_participation_date ASC;

但是在两个ID上分组会给予我重复的用户观察。

vwkv1x7d

vwkv1x7d1#

一个FIRST_VALUE窗口函数加上一个DISTINCT来删除重复项,就可以实现你想要的功能。

SELECT DISTINCT
       user_id,
       FIRST_VALUE(created_at)    OVER w AS first_participation_date,
       FIRST_VALUE(tournament_id) OVER w AS first_tournament_id
FROM participant_status
WINDOW w AS (PARTITION BY user_id ORDER BY created_at)

或者,您可以使用ROW_NUMBER()RANK()DENSE_RANK()窗口函数。
这个查询稍微复杂一点,但灵活得多:它允许您选择第一个N锦标赛,而不仅仅是第一个,不同的窗口功能处理领带(=同一天的几个注册)彼此不同。
下面是ROW_NUMBER()的版本。

SELECT user_id, created_at, tournament_id
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) AS NumParticipation
    FROM participant_status
) T
WHERE NumParticipation <= 1
gzszwxb4

gzszwxb42#

未检测,但:

SELECT DISTINCT ON(user_id) 
    user_id, created_at AS first_participation_date, tournament_id
FROM 
    participant_status
ORDER BY 
    user_id, first_participation_date ASC;

有关详细信息,请参见Distinct。

相关问题