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

标签 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

对于每年的每个球员,我想计算他们的“职业生涯年”,即他们打球的年数:
  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/

相关文章:

sql - 重新排序 sql 数据库中的行 - 想法

sql - 计算直到某个日期的唯一组合 - 每月

c# - LINQ Group By 多表Inner Join 和聚合函数

r - 解释R Tapply描述

iphone - 核心数据: Subquery Performance Problem

sql-server - 仅通过 MS SQL Server 中的 EntryDate 和 Emp_id 查找每个组中的最低开始日期时间和最高结束日期时间

mysql - SQL按函数分组错误

Sql Server 按特定顺序显示项目

mysql - 删除表的内容

sql - Oracle - 在 where 子句中使用嵌套表列