簡體   English   中英

最大值和最小值的T-sql等級

[英]T-sql rank for max and min value

我需要有關T-SQL查詢的幫助。

我有一個具有這種結構的表:

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

我需要一個查詢來產生這種結果:

身份證號:1

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

身份證號:2

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

我該怎么做?

提前致謝

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

這種查詢就是為什么您應該規范化數據的原因。

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

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)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM