不知道如何表述这个问题,但我想要一个应用于多行的聚合查询。希望一个例子能让这更容易。假设我有以下数据:
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
对于每年的每个球员,我想计算他们的“职业生涯年”,即他们打球的年数:
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
很自然地将此转换表示为
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
我一般如何克服这个问题(即,不仅在这种情况下,而且每当我想执行结合现有列和使用聚合函数计算的单个每组数字的算术运算时)?
最佳答案
您可以使用 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
Demo
看看强大的
OVER
clause .
关于sql - SQL 中的组合聚合和非聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16531560/