【问题标题】:How to rank/dense_rank by grouping column如何通过分组列进行排名/密集排名
【发布时间】:2014-09-30 17:33:19
【问题描述】:

以什么可能的方式/方法使用 sql 查询来获得这种结果。

评委对每位参赛者打分排名,对决赛选手进行排序显示最终排名。

这个@Prince Jea 给出了一个解决方案,但它不是我所期待的实际结果,尽管它是正确的。不过,我正在寻找所需的输出。

SQL 查询

    SELECT ContestantID,JudgeID,ScorePoints, 
    RANK() OVER (ORDER BY ScorePoints DESC) AS xRank,
    DENSE_RANK() OVER (ORDER BY ScorePoints DESC) AS fRank
FROM 
( 
SELECT ContestantID , ScorePoints, JudgeID
FROM Score
) AS a
ORDER BY 1

结果

我更喜欢 SQL Fiddle 上的一些材料 http://www.sqlfiddle.com/#!6/30d03/2

【问题讨论】:

  • 您是否需要针对 3 名法官的查询,或者该查询是否需要能够处理动态的法官人数?
  • 法官先生的动态数量。但如果什么是最好的,那就不要了。

标签: sql dense-rank


【解决方案1】:

第一个CTE在Judge栏做PIVOT

第二个 CTE 是根据评委分数计算每个参赛者的排名

第三届 CTE 正在计算每位参赛者的最终分数

  ; WITH CTE 
    AS
    (
    SELECT ContestantID,
           MAX(CASE when JudgeID =1 THEN ScorePoints END ) as [JudgeID#1],
           MAX(CASE when JudgeID =2 THEN ScorePoints END ) as [JudgeID#2],
           MAX(CASE when JudgeID =3 THEN ScorePoints END ) as [JudgeID#3]
    FROM Score
    Group by ContestantID
    )
    ,  CTE2 AS
    (
    SELECT ContestantID,
           [JudgeID#1],
           RANK() OVER   ( Order by JudgeID#1 desc ) as 'Rank#1',       
           [JudgeID#2],
           RANK() OVER   ( Order by JudgeID#2 desc ) as 'Rank#2',       
           [JudgeID#3],
           RANK() OVER   ( Order by JudgeID#3 desc ) as 'Rank#3'

    FROM CTE
    )
    , CTE3 as
    (
    SELECT ContestantID,
          SUM (Rank#1+ Rank#2 + Rank#1) as total
    FROM CTE2
    GROUP BY ContestantID
    )
    SELECT CTE2.*, CTE3.total as 'Final Score'
    FROM  CTE2
    JOIN CTE3 
    ON CTE2.ContestantID = CTE3.ContestantID
    ORDER BY ContestantID

【讨论】:

  • 太棒了!这就是我要找的。我接受你的回答。非常感谢。
【解决方案2】:

这是一个动态数据透视查询,适用于任意数量的法官。枢轴代码改编自https://stackoverflow.com/a/12505138/3574819。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @cols2 AS NVARCHAR(MAX),
    @cols3 AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ', ' + QUOTENAME(JudgeID) 

                    from Score
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


select @cols2 = STUFF((SELECT distinct '+' + QUOTENAME('rn' + CONVERT(varchar(1),JudgeID)) 
                    from Score
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @cols3 = STUFF((SELECT distinct ', ' + QUOTENAME(JudgeID) + ', rank() over (order by  ' + QUOTENAME(JudgeId) + ' desc) ' + QUOTENAME('rn' + CONVERT(varchar(1),JudgeID))

                    from Score
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT * ,
        rank() over (order by ' + @cols2 + ') rn, 
        ( ' + @cols2 + ' ) fn
        FROM (SELECT ContestantID,' + @cols3 + ' from 
             (
              select ContestantID, ScorePoints, JudgeID
              from Score
            ) x
            pivot 
            (
                max(ScorePoints)
                for JudgeID in (' + @cols + ')
            ) p ) t1'

execute(@query)

http://www.sqlfiddle.com/#!6/87b45/1

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2010-10-06
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多