SQL中的组合聚合和非聚合查询

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)

我怎样才能克服这个问题(即不仅仅是针对这种情况,而且每当我想要执行一个算术运算,将现有的列和一个用聚合函数计算的单个每个组号组合起来)?

Tim*_*ter 4

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条款