2014-12-05 84 views
1

我试图设计一个sql查询,可以采取一列结果并返回第一个“n”结果的平均值/平均值。获得前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 | 

回答

3

你可以如果你使用窗口函数,有一个很好的解决方案。
这虽然只适用于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; 
+0

出色的答案,但它不会在2008年 – radar 2014-12-05 20:30:47

+0

工作@radar是的,我才意识到这一点。它需要SQL Server 2012,我想。 – 2014-12-05 20:31:34

+0

是的,你是对的。 2012年已经介绍了这个。 – radar 2014-12-05 20:33:21