had*_*ley 5 sql aggregate-functions
不知道如何表达这个问题,但我希望将聚合查询应用于多行.希望一个例子可以让这更容易.假设我有以下数据:
player | year | games
-------------------------
ausmubr01 | 2006 | 139
ausmubr01 | 2007 | 117
bondsba01 | 2006 | 130
bondsba01 | 2007 | 126
stairma01 | 2006 | 26
stairma01 | 2006 | 77
stairma01 | 2006 | 14
stairma01 | 2007 | 125
Run Code Online (Sandbox Code Playgroud)
对于每年的每位球员,我想计算他们的"职业生涯年",即他们一直在玩的年数:
player | year | games | cyear
--------------------------------
ausmubr01 | 2006 | 139 | 1
ausmubr01 | 2007 | 117 | 2
bondsba01 | 2006 | 130 | 1
bondsba01 | 2007 | 126 | 2
stairma01 | 2006 | 26 | 1
stairma01 | 2006 | 77 | 2
stairma01 | 2006 | 14 | 3
stairma01 | 2007 | 125 | 4
Run Code Online (Sandbox Code Playgroud)
表达此转换是很自然的,SELECT player, year, games, year - min(year) + 1 as cyear FROM baseball GROUP by player但由于聚合查询的规则,表达式仅针对每个组进行一次评估:
player | year | games | cyear
--------------------------------
ausmubr01 | 2006 | 139 | 1
bondsba01 | 2006 | 130 | 1
stairma01 | 2006 | 26 | 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能克服这个问题(即不仅仅是针对这种情况,而且每当我想要执行一个算术运算,将现有的列和一个用聚合函数计算的单个每个组号组合起来)?
ROW_NUMBER您可以在职业年中使用 :
SELECT player, year, games,
cyear = ROW_NUMBER () OVER (PARTITION BY player ORDER BY year),
gamesPerMax = 1.0 * games / MAX(games) OVER (PARTITION BY player)
FROM dbo.TableName
Run Code Online (Sandbox Code Playgroud)
看看强大的OVER条款。