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;
注:这似乎满足了问题的意图。然而,示例结果似乎遵循与描述不同的逻辑。
我有一个派生的 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;
注:这似乎满足了问题的意图。然而,示例结果似乎遵循与描述不同的逻辑。