2014-02-24 17 views
0

移動平均值無法在我的表格上工作。它只是分散每行的行數據,而不是產生我尋求的平均值。基於巧妙的常見查詢的SQL移動平均值不起作用

基於ACQ的移動平均SQL :(http://www.artfulsoftware.com/infotree/qrytip.php?id=445

SELECT t1.item,t1.dt, AVG(t2.qty) AS 5DayAvg 
FROM t t1 
JOIN t t2 ON t1.item=t2.item AND DATEDIFF(t1.dt, t2.dt) BETWEEN 0 AND 4 
GROUP BY t1.item,t1.dt; 

我適應代碼:

SELECT t1.id, t1.t, t1.atm_p, AVG(t2.atm_p) as 20sec_atm_p_avg 
FROM test_data t1 
JOIN test_data t2 ON t1.id = t2.id AND TIME_TO_SEC(TIMEDIFF(t1.t, t2.t)) BETWEEN 0 AND 19 
GROUP BY t1.t; 

我TEST_DATA表:

id,t,atm_p 
'1', '08:01:25', '12.9' 
'2', '08:01:35', '12.9' 
'3', '08:01:45', '13.2' 
'4', '08:01:55', '14.0' 
'5', '08:02:05', '12.0' 
'6', '08:02:15', '13.9' 
'7', '08:02:20', '12.9' 
'8', '08:02:25', '14.0' 
'9', '08:02:30', '14.0' 
'10', '08:02:35', '12.0' 
'11', '08:02:40', '11.0' 
'12', '08:02:45', '3.0' 
'13', '08:02:50', '14.0' 
'14', '08:02:55', '12.0' 
'15', '08:03:00', '12.9' 

我的錯誤輸出:

id t  atm_p 20sec_atm_p_avg 
1 08:01:25 12.9 12.90000 
2 08:01:35 12.9 12.90000 
3 08:01:45 13.2 13.20000 
4 08:01:55 14.0 14.00000 
5 08:02:05 12.0 12.00000 
6 08:02:15 13.9 13.90000 
7 08:02:20 12.9 12.90000 
8 08:02:25 14.0 14.00000 
9 08:02:30 14.0 14.00000 
10 08:02:35 12.0 12.00000 
11 08:02:40 11.0 11.00000 
12 08:02:45 3.0 3.00000 
13 08:02:50 14.0 14.00000 
14 08:02:55 12.0 12.00000 
15 08:03:00 12.9 12.90000 

將不勝感激的任何幫助!

回答

1

我覺得考慮移動相關子查詢的平均值要容易得多,而不是用聚合連接。

select t1.*, 
     (select avg(t2.qty) 
     from t t2 
     where TIME_TO_SEC(TIMEDIFF(t1.t, t2.t)) BETWEEN 0 AND 19 
     ) as `5DayAvg` 
from t t1; 

但是,您的查詢的問題是id上的連接。只是刪除:

SELECT t1.id, t1.t, t1.atm_p, AVG(t2.atm_p) as 20sec_atm_p_avg 
FROM test_data t1 JOIN 
    test_data t2 
    ON TIME_TO_SEC(TIMEDIFF(t1.t, t2.t)) BETWEEN 0 AND 19 
GROUP BY t1.id, t1.t; 
+0

完美的工作(當然)。你的ALT建議看起來很直觀,可能表現更好。會試試看。非常感謝! –

0

你有沒有嘗試加入基於Date_Add 20秒?

SELECT 
     t1.id, 
     t1.t, 
     t1.atm_p, 
     AVG(t2.atm_p) as 20sec_atm_p_avg 
    FROM 
     test_data t1 
     JOIN test_data t2 
      ON t1.id = t2.id 
      AND t2.t >= t1.t 
      AND t2.t <= t1.t + INTERVAL 20 SECONDS 
    GROUP BY 
     t1.t; 
+0

喜歡你的格式 - 使以下SQL邏輯變得如此簡單! –

+0

有趣,但不幸的是,它沒有產生任何結果(我將「SECONDS」更改爲「SECOND」)... –