T-SQL 2008选择组的第一行第二行和第三行

时间:2015-01-24 00:16:37

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有一个派生表,在一列中有成就,在下一列中有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

我不确定如何做到这一点,非常感谢任何开始的方向!

2 个答案:

答案 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 ..

)来完成的

检查小提琴http://sqlfiddle.com/#!3/d8f0f/8

答案 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;

注意:这似乎满足了问题的意图。然而,样本结果似乎遵循与所描述的逻辑不同的逻辑。