我有一个派生表,在一列中有成就,在下一列中有personID,在下一列中有成就等级。 我的目标是创建一个在最左边的列中具有明显成就的表格,接下来的五列是将成就作为其最高排名,第二高排名,第三高排名等成就的人数。 因此,排名为2的人员排名最高,12人排名第二,将列入第一列 对于Achiev2,以及Achiev12的第二列
等级范围从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
我不确定如何做到这一点,非常感谢任何开始的方向!
答案 0 :(得分: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(partition ..
)来完成的答案 1 :(得分:0)
您可以使用条件aggegation:
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;
注意:这似乎满足了问题的意图。然而,样本结果似乎遵循与所描述的逻辑不同的逻辑。