繁体   English   中英

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

[英]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 ..

检查小提琴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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM