【问题标题】:SELECT TOP 3 Max Score选择 TOP 3 最高分
【发布时间】:2022-09-25 14:13:33
【问题描述】:

我有一个关于如何表达一些结果的输出的问题? 问题是: 有许多比赛,参与者每个人都进行了多次尝试。得分最高的尝试仅被考虑一次。编写查询以列出在每场比赛中排名前 3 的参赛者。如果多个参赛者在每场比赛中得分相同,则他们处于同一排名。

报告 event_id、排名 1 名称、排名 2 名称、排名 3 名称。通过 event_id 订购比赛。共享等级的名称应按字母顺序排列并用逗号分隔。

该数据库仅包含一个表:

event_id participant_name score
1434 Marcos 9.62821024209408
1434 Marcos 7.30471832966565
1434 Vitor 9.52821024209408
1434 Vitor 6.30471832966565

我的查询是:

WITH max_score AS (
  SELECT event_id, participant_name, CAST(MAX(ROUND(score, 2,1)) AS DECIMAL (18,2)) AS score
  FROM scoretable 
  GROUP BY event_id, participant_name
),
Rank_table AS( 
  SELECT 
       event_id, 
       participant_name,
       score,
       DENSE_RANK() OVER   
        (PARTITION BY event_id ORDER BY score DESC) AS FinalRank
FROM max_score
)
SELECT * FROM Rank_table
WHERE FinalRank <= 3
ORDER BY event_id, score DESC;
event_id participant_name score FinalRank
1434 Aurora Leedom 9.98 1
1434 Shaunta Barletta 9.88 2
1434 Tricia Norgard 9.85 3
2626 Annita Tessier 9.95 1
2626 Loura Fortino, 9.95 1
2626 Christinia Padgett 9.94 2
2626 Ashlyn Cheatam 9.72 3

所以我可以让结果排名,我的问题是我可以使用什么资源使结果看起来像这样:

event_id Rank 1 Rank 2 Rank 3
1434 Aurora Leedom Shaunta Barletta Tricia Norgard
2626 Annita Tessier, Loura Fortino Christinia Padgett Ashlyn Cheatam

任何帮助,将不胜感激!

    标签: sql sql-server tsql


    【解决方案1】:

    使用数据透视查询生成所需的 3 个输出列:

    WITH cte AS (
        SELECT *, DENSE_RANK() OVER (PARTITION BY event_id ORDER BY FinalRank) dr
        FROM Rank_table
    )
    
    SELECT event_id,
           STRING_AGG(CASE WHEN dr = 1 THEN participant_name END, ',')
               WITHIN GROUP (ORDER BY participant_name) AS [Rank 1],
           STRING_AGG(CASE WHEN dr = 2 THEN participant_name END, ',')
               WITHIN GROUP (ORDER BY participant_name) AS [Rank 2],
           STRING_AGG(CASE WHEN dr = 3 THEN participant_name END, ',')
               WITHIN GROUP (ORDER BY participant_name) AS [Rank 3]
    FROM cte
    ORDER BY event_id;
    

    【讨论】:

    • 您的答案如何处理“如果多个参赛者在每场比赛中得分相同,则他们处于同一排名。”和“共享等级的名称应按字母顺序排列并用逗号分隔。”?
    • @HABO对不起,错过了这个要求。我已经更新了我的答案。
    • @TimBiegeleisen 很棒的解决方案我想到了 Pivot,但是添加一个或多个具有相同等级的问题妨碍了我。您的解决方案对我很有帮助,非常感谢分享知识。
    【解决方案2】:

    scoretable that i used as reference

    /* MYSQL SOLUTION / /使用多个公用表表达式,dense_rank 和 group_concat */

    与 t1 作为 (SELECT *,DENSE_RANK() OVER(PARTITION BY event_id ORDER BY score DESC) AS 'rk' FROM Scoretable),

    t2 AS (SELECT * FROM t1 WHERE rk<=3),

    t3 作为 (SELECT event_id , CASE WHEN rk=1 THEN p_Name ELSE NULL END AS 'first' FROM t2 WHERE rk=1 ),

    t4 作为 (SELECT event_id , CASE WHEN rk=2 THEN p_Name ELSE NULL END AS 'second' FROM t2 WHERE rk=2 ),

    t5 AS (SELECT event_id , CASE WHEN rk=3 THEN p_Name ELSE NULL END AS 'third' FROM t2 WHERE rk=3 ),

    t6 作为 (SELECT t3.event_id , t3.first , t4.second , t5.third FROM t3 JOIN t4 ON t3.event_id = t4.event_id JOIN t5 ON t4.event_id=t5.event_id ORDER BY 1,2,3,4)

    SELECT event_id , GROUP_CONCAT(DISTINCT first) AS 'rank 1' , GROUP_CONCAT(DISTINCT second) AS 'rank 2' , GROUP_CONCAT(DISTINCT third) AS 'rank 3' 从 t6 GROUP BY 1 ORDER BY 1;

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多