postgresql 找出每个比赛中最年轻球员的年龄和姓名

a7qyws3x  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(126)

表格"参与者":
| 点接受点标识|目标接受点名称|brt_dt|
| - ------|- ------|- ------|
| 1个|安娜·佩雷斯|二○ ○一年十月十日|
| 第二章|施若望|一九九九年四月三日|
| 三个|朱迪·安|二○ ○一年十月十日|
表格"人种":
| 种族标识|种族名称|种族_日期|
| - ------|- ------|- ------|
| 1个|呜呜呜|2023年1月1日|
| 第二章|速度与激情|2022年1月1日|
表"个体_人种_记录":
| 内部资源标识|点接受点标识|种族标识|运行时间|
| - ------|- ------|- ------|- ------|
| 1个|1个|1个|00时59分13秒|
| 第二章|1个|第二章|01时19分14秒|
| 三个|第二章|1个|00时48分05秒|
| 四个|第二章|第二章|01时01分17秒|
| 五个|三个|第二章|01时31分18秒|
我想为每个比赛项目选择最年轻参赛者的姓名和年龄,以及每个比赛项目的名称和年份。
这是我目前掌握的情况:

SELECT
    r.race_name, 
    EXTRACT(YEAR FROM r.race_date) AS year, 
    COALESCE(CAST(min.age AS varchar), 'N/A')  
FROM(
    SELECT 
        race_id, 
        EXTRACT(YEAR FROM MIN(AGE(brt_dt))) AS age 
    FROM(
        SELECT p.ptcpt_id, p.brt_dt, irr.race_id
        FROM participant p 
        INNER JOIN individual_race_record irr
            ON p.ptcpt_id = irr.ptcpt_id
     ) sub
     GROUP BY race_id
) min
RIGHT JOIN race r ON r.race_id=min.race_id
ORDER BY year DESC

这导致下表:
| 种族名称|年份|年龄|
| - ------|- ------|- ------|
| 呜呜呜|二○二三|二十一|
| 速度与激情|小行星2022|二十一|
但我想要的是:
| 种族名称|年份|年龄|目标接受点名称|
| - ------|- ------|- ------|- ------|
| 呜呜呜|二○二三|二十一|安娜·佩雷斯|
| 速度与激情|小行星2022|二十一|安娜·佩雷斯|
| 速度与激情|小行星2022|二十一|朱迪·安|
问题是我无法将它与参赛者表连接起来。我还需要另一列来记录最年轻参赛者的姓名。如果一场比赛中有多个最年轻的参赛者,我想把它们都显示出来。当我尝试为'min'表选择ptcpt_id时,它导致了一个错误,提示我必须在GROUP BY函数下也包含ptcpt_id。I don "我不需要按参与者分组。
我将非常感谢在这个问题上的任何帮助和线索。谢谢。

ee7vknir

ee7vknir1#

您可以使用FETCH FIRST ROWS WITH TIES来收集与第一个ORDER BY字段相关的所有记录。也就是说,如果我们使用DENSE_RANK根据年龄为每个种族的每个人分配一个排名,它将允许获得每个种族中年龄最小的所有人。由于我们使用DENSE_RANK,如果年龄最小的人不止一个,它将检索所有人。

SELECT r.race_name,
       EXTRACT(YEAR FROM r.race_date) AS "year",
       DATE_PART('year', r.race_date) - DATE_PART('year', p.brt_dt) AS age,
       p.ptcpt_name
FROM       participant            p
INNER JOIN individual_race_record irr ON p.ptcpt_id = irr.ptcpt_id
INNER JOIN race                   r   ON r.race_id = irr.race_id
ORDER BY DENSE_RANK() OVER(
             PARTITION BY race_name 
             ORDER     BY DATE_PART('year', r.race_date) - DATE_PART('year', p.brt_dt))
FETCH FIRST 1 ROWS WITH TIES

输出:
| 种族名称|年份|年龄|目标接受点名称|
| - ------|- ------|- ------|- ------|
| 速度与激情|小行星2022|二十一|安娜·佩雷斯|
| 速度与激情|小行星2022|二十一|朱迪·安|
| 呜呜呜|二○二三|二十二|安娜·佩雷斯|
检查here演示。

相关问题