[英]T-SQL 2008 Select first second and third row of group
我有一个派生表,该表在一个列中具有成就,在下一列中具有personID,在下一列中具有成就级别。 我的目标是创建一个表,该表在最左边的一列中具有不同的成就,接下来的五列是将该成就作为其最高排名第一,第二最高排名,第三最高排名等的人数。 因此,将Achiev2的第一列和第二列的Achiev2分别算为排名最高的成就2和第二高的成就12的人。
等级从1到无限。 等级1是最高等级。
源表示例
Achievement | PersonID | Rank
------------------------------
Achiev1 | 1 | 1
Achiev2 | 3 | 2
AChiev2 | 1 | 2
Achiev1 | 2 | 1
预期产量
Achievement | #OfPeopleHighestAchiev | #OfPeopleSecondHighestAchiev | etc.
--------------------------------------------------------------------
Achiev1 | 2 | 0
Achiev2 | 1 | 1
我不确定该怎么做,从何处开始的任何方向将不胜感激!
这是可能的变体之一:
select
Achievement,
sum(case when RankNum = 1 then 1 else 0 end) as HighRank1,
sum(case when RankNum = 2 then 1 else 0 end) as HighRank2,
...
from (
select
PersonId,
Achievement,
row_number() over(
partition by PersonId order by Rank) as RankNum
from sourcetable
) as t
group by Achievement
主要思想是为每个人的每个成就分配编号,这是通过over(part ..
您可以只使用条件性聚合:
select achievement,
sum(case when rank = 1 then 1 else 0 end) as rank1,
sum(case when rank = 2 then 1 else 0 end) as rank2,
sum(case when rank = 3 then 1 else 0 end) as rank3,
sum(case when rank = 4 then 1 else 0 end) as rank4,
sum(case when rank = 5 then 1 else 0 end) as rank5
from source
group by achievement;
注意:这似乎满足了问题的意图。 但是,样本结果似乎遵循的逻辑与所描述的不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.