2014-12-05 83 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