【问题标题】:Getting the average over the first n rows获取前 n 行的平均值
【发布时间】:2015-02-04 02:29:41
【问题描述】:

我正在尝试设计一个 sql 查询,它可以获取一列结果并返回前“n”个结果的平均值/平均值。

换句话说,如果我有一个如下所示的数据样本:

|  Day  | Number of People |
|:-----:|:----------------:|
| 12/01 |         4        |
| 12/02 |         8        |
| 12/03 |         5        |
| 12/04 |         6        |
| 12/05 |         8        |
| 12/06 |         3        |
| 12/07 |         5        |

我想要一个可以导致表格如下所示的查询:

|  Day  | Number of People |  nMean |
|:-----:|:----------------:|:------:|
| 12/01 |         4        |    4   |
| 12/02 |         8        |    6   |
| 12/03 |         5        | 5.6667 |
| 12/04 |         6        |  5.75  |
| 12/05 |         8        |   6.2  |
| 12/06 |         3        | 5.6667 |
| 12/07 |         5        | 5.5714 |

【问题讨论】:

    标签: sql sql-server sql-server-2008 average mean


    【解决方案1】:

    如果你使用窗口函数,你可以有一个非常优雅的解决方案。
    但这仅适用于 SQL Server 2012 及更高版本。

    SELECT d.[day], 
    AVG(d.[num] * 1.0) OVER
    (
         ORDER BY d.[day] ASC
         ROWS BETWEEN UNBOUNDED PRECEDING
         AND CURRENT ROW
    ) AS nMean
    FROM [data] d;
    

    这也应该有效(即使在 SQL Server 2008 中):

    select d2.[day], avg(1.0 * d1.num) as nMean
    from
    data d2 
    join data d1 on d2.day >= d1.day
    group by d2.[day]
    order by d2.[day] asc;
    

    【讨论】:

    • @radar 是的,我也刚刚意识到这一点。我认为它需要 SQL Server 2012。
    • 嗯..你又做了一次。 2008 版本要简单得多。
    • @radar ...但不确定是否有效;)
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多