2012-07-16 63 views
0
集團

我有一個訪問表和這樣的時間序列數據:計算在最前N個值每

loc | date | value 
A 2/11/07 50 
A 2/12/07 45 
A 2/13/07 23 
B 2/11/07 34 
B 2/12/07 46 
B 2/13/07 56 
C ....... ... 
... 
D.......... 
..... 

而且我想要得到的Z,(價值 - AVG(值)/髮網(值),每個組在不同時間段的值,因此20 z值將考慮過去20天的值,60天內的60天等等。而且我還希望在最近一天選擇z值,以便結果看起來像像這樣:

loc | date | value | 20Day zValue | 60Day ZValue | 120 day Zvalue 
A 2/13/07 23  .04   .09   .6 
B 2/13/07 56   .87   .54   .96 
C ..................... 

回答

1

試試這個:

SELECT 
    a.*, 
    b.20Day_zValue, 
    c.60Day_zValue, 
    d.120Day_zValue 
FROM 
(
    SELECT aa.loc, aa.date, aa.value 
    FROM tbl aa 
    INNER JOIN 
    (
     SELECT loc, MAX(date) AS maxdate 
     FROM tbl 
     GROUP BY loc 
    ) bb ON aa.loc = bb.loc AND aa.date = bb.maxdate 
) a 
INNER JOIN 
(
    SELECT loc, AVG(value)/StDev(value) AS 20Day_zValue 
    FROM tbl 
    WHERE date >= DateAdd('d', -20, Date()) 
    GROUP BY loc 
) b ON a.loc = b.loc 
INNER JOIN 
(
    SELECT loc, AVG(value)/StDev(value) AS 60Day_zValue 
    FROM tbl 
    WHERE date >= DateAdd('d', -60, Date()) 
    GROUP BY loc 
) c ON a.loc = c.loc 
INNER JOIN 
(
    SELECT loc, AVG(value)/StDev(value) AS 120Day_zValue 
    FROM tbl 
    WHERE date >= DateAdd('d', -120, Date()) 
    GROUP BY loc 
) d ON a.loc = d.loc 
+0

感謝您的幫助,但我不斷收到查詢表達式「b.20.Day_zAdjClose」中的「Syntax error(missing operator) – kogilvie 2012-07-17 05:59:29

0

我想出了一個解決方案,zane的答案是一個好的開始。主要問題是ms訪問需要多個連接。基本包圍結構是這樣的:

Select a,b,c 
FROM 
(((Table1 Inner Join Table2 ON a = b) 
Inner Join Table3 ON a = c) 
Inner Join Table4 ON a = d) 

而且解決我的問題是:

SELECT A.loc AS Location, A.value AS Value, 
    (A.value - B.OneMonthAvg)/B.OneMonthStdev AS OneMonthZscore, 
    (A.value - C.ThreeMonthAvg)/C.ThreeMonthStdev AS ThreeMonthZscore, 
    (A.value - D.SixMonthAvg)/D.SixMonthStdev AS SixMonthZscore, 
    (A.value - E.OneYearAvg)/E.OneYearStdev AS OneYearZscore, 
    (A.value - F.TwoYearAvg)/F.TwoYearStdev AS TwoYearZscore, 
    (A.value - G.ThreeYearAvg)/G.ThreeYearStdev AS ThreeYearZscore 

FROM 
(((((((tbl AS A 
INNER JOIN 
    (SELECT loc, AVG(value) AS OneMonthAvg, STDEV(value) AS OneMonthStdev 
    FROM tbl 
    WHERE date >= DateAdd('m', -1, Date()) 
    GROUP BY loc) 
AS B ON A.loc = B.loc) 
INNER JOIN 
    (SELECT loc, AVG(value) AS ThreeMonthAvg, STDEV(value) AS ThreeMonthStdev 
    FROM tbl 
    WHERE date >= DateAdd('m', -3, Date()) 
    GROUP BY loc) 
AS C ON A.loc = C.loc) 
INNER JOIN 
    (SELECT loc, AVG(value) AS SixMonthAvg, STDEV(value) AS SixMonthStdev 
    FROM tbl 
    WHERE date >= DateAdd('m', -6, Date()) 
    GROUP BY loc) 
AS D ON A.loc = D.loc) 
INNER JOIN 
    (SELECT loc, AVG(value) AS OneYearAvg, STDEV(value) AS OneYearStdev 
    FROM tbl 
    WHERE date >= DateAdd('yyyy', -1, Date()) 
    GROUP BY loc) 
AS E ON A.loc = E.loc) 
INNER JOIN 
    (SELECT loc, AVG(value) AS TwoYearAvg, STDEV(value) AS TwoYearStdev 
    FROM tbl 
    WHERE date >= DateAdd('yyyy', -2, Date()) 
    GROUP BY loc) 
AS F ON A.loc = F.loc) 
INNER JOIN 
    (SELECT loc, AVG(value) AS ThreeYearAvg, STDEV(value) AS ThreeYearStdev 
    FROM tbl 
    WHERE date >= DateAdd('yyyy', -3, Date()) 
    GROUP BY loc) 
AS G ON A.loc = G.loc) 
Where A.date = Date() 

我改變了我想要得到的z分數的時間範圍。