T-sql为最大值和最小值排名

时间:2012-09-11 12:27:12

标签: sql sql-server tsql rank with-statement

我需要有关t-sql查询的帮助。

我有一个具有这种结构的表:

id  |  OverallRank  |  FirstRank  |  SecondRank  |  Nrank..
1   |       10      |    20       |     30       |    5
2   |       15      |    24       |     12       |    80
3   |       10      |    40       |     37       |    12

我需要一个产生这种结果的查询:

当id:1

id  |  OverallRank  |  BestRankLabel  |  BestRankValue  |  WorstRankLabel  | WorkRankValue
1   |     10        |    SecondRank   |        30       |     Nrank        |       5

当id:2

id  |  OverallRank  |  BestRankLabel  |  BestRankValue  |  WorstRankLabel  | WorkRankValue
1   |     15        |    FirstRank    |        24       |     SecondRank   |       12

我该怎么做?

提前致谢

3 个答案:

答案 0 :(得分:0)

CASE 
   WHEN OverallRank > FirstRank and OverallRank > FirstSecondRand and  OverallRank > nRank THEN 'OverallRank' 
   WHEN FirstRank > OverallRank ... THEN 'FirstRank' 
END

答案 1 :(得分:0)

这种查询为什么你应该规范化你的数据。

declare @id int, @numranks int
select @id = 1, @numranks = 3 -- number of Rank columns

;with cte as    
(   
    select *
    from
    (
        select *,
            ROW_NUMBER() over (partition by id order by rank desc) rn
        from
        (
        select * from YourBadlyDesignedTable
            unpivot (Rank for RankNo in (FirstRank, SecondRank, ThirdRank))u -- etc
        ) v2
    ) v1
    where id=@id and rn in (1, @numranks)
) 
    select 
        tMin.id, 
        tMin.OverallRank,       
        tMin.RankNo as BestRankLabel,
        tMin.Rank as BestRankValue,
        tMax.RankNo as WorstRankLabel,
        tMax.Rank as WorstRankValue
    from (select * from cte where rn=1) tMin
        inner join (select * from cte where rn>1) tMax
            on tMin.id = tmax.id

如果您想要所有行,可以取出id = @id

答案 2 :(得分:0)

with cte(id, RankValue,RankName) as (
            SELECT id, RankValue,RankName
            FROM 
                        (SELECT id,  OverallRank,  FirstRank,  SecondRank, Nrank 
                        FROM ##input) p
            UNPIVOT
                        (RankValue FOR RankName IN 
                                    (OverallRank,  FirstRank,  SecondRank, Nrank)
            )AS unpvt)
select t1.id, max(case when RankName = 'OverallRank'  then RankValue else null end) as OverallRank,
        max(case when t1.RankValue = t2.MaxRankValue then RankName else null end) as BestRankName,
        MAX(t2.MaxRankValue) as BestRankValue,
        max(case when t1.RankValue = t3.MinRankValue then RankName else null end) as WorstRankName,
        MAX(t3.MinRankValue) as WorstRankValue
        from cte as t1
        left join (select id, MAX(RankValue) as MaxRankValue from cte group by id) as t2 on t1.id = t2.id
        left join (select id, min(RankValue) as MinRankValue from cte group by id) as t3 on t1.id = t3.id
    group by t1.id

适合您的测试数据。您只应通过添加右列的名称来编辑RankName IN(OverallRank,FirstRank,SecondRank,Nrank)。