T-SQL2008Select第一组第二第三行

T-SQL 2008 Select first second and third row of group

我有一个派生的 table,它在一列中有成就,在下一列中有 personID,在下一列中有成就级别。 我的目标是创建一个 table 在最左边的列中具有不同的成就,接下来的五列是将该成就作为最高排名、第二高排名、第三高排名等的人数。成就。 因此,将排名 2 作为最高排名成就的人,将 12 作为第二高排名成就的人计入第一列 为 Achiev2,第二列为 Achiev12

等级从 1 到无穷大。 等级 1 是最高等级。

示例来源Table

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(partition..

检查 fiddle http://sqlfiddle.com/#!3/d8f0f/8

您可以只使用条件聚合:

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;

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