2013-10-10 126 views
1

我有一個表[製作]包含以下結構:12個月均線,日期

rep (char(10))  
,cyc_date (datetime) ---- already standardized to mm/01/yyyy 
,amt (decimal) 

我對各rep從1/1/2011到2013年8月1日的數據。我希望能夠做的就是創建一個12個月移動平均數開始1/1/2012每個代表,具體如下:

rep cyc_dt 12moAvg 
------------------------- 
A  1/1/2012 10000.01 
A  2/1/2012 13510.05 
.  ........ ........ 
A  8/1/2013 22101.32 
B  1/1/2012 98328.22 
B  ........ ........ 

,其中每一行代表說,代表在規定的時間12個月移動平均數。我發現一些模糊的例子,我嘗試了它們無濟於事。看來,通過rep組件添加組是與其他示例的主要背離。

這是關於據我得到:

SELECT 
    rep, 
    cyc_date, 
    (
     SELECT Avg([amt]) 
     FROM production Q 
     WHERE Q.[cyc_date] BETWEEN DateAdd("yyyy",-1,[cyc_date]+1) AND [cyc_date] 
    ) AS 12moavg 
FROM production 

該查詢似乎總平均值或和拉,因爲在相關子查詢沒有分組。當我嘗試分組時,我得到一個錯誤,它最多隻能返回一行。

+0

'cyc_dt'中的值總是在每月的第一天? – HansUp

+0

是的,抱歉,那不清楚。每個cyc_dt的日期都標準化到本月的第一天。 – Jeremy

+0

謝謝。那麼對於'rep' A和'cyc_dt' 1/1/2012,'12moAvg'代表2011年1月1日至2011年12月1日期間'amt'值的平均值,還是包含'amt'值2012年1月1日在那個平均? – HansUp

回答

2

我認爲它可能適用於相關子查詢的2個調整。

  1. DateAdd()表達式中減去11個月。
  2. 包含另一個WHERE條件以將平均值限制爲與父(含)查詢的當前行相同的rep
SELECT 
    p.rep, 
    p.cyc_date, 
    (
     SELECT Avg(Q.amt) 
     FROM production AS Q 
     WHERE 
       Q.rep = p.rep 
      AND 
       Q.cyc_date BETWEEN DateAdd("m", -11, p.cyc_date) 
        AND p.cyc_date 
    ) AS [12moavg] 
FROM production AS p; 

相關子查詢可能會很慢。請務必索引repcyc_date以限制此問題。

+0

賓果。這工作完美。我沒有考慮在WHERE語句中顯式設置rep關聯。我的思想完全在聚合路線上。非常感謝你的幫助。希望這也能幫助其他人。 – Jeremy

+0

另外,同意在非聚合字段上編制索引。幸運的是,數據並不是很大,因此運行速度相對較快。 – Jeremy

+0

好的,很好。一旦你向我們展示了SQL,我可以看到你接近了相關的子查詢,但只需通過'rep'約束平均值。感謝您展示SQL! – HansUp

相關問題