2014-03-06 87 views
5

我知道Big Query中有一個AVG函數,並且有窗口函數可以將上一個值或下一個值向上或向下移動一行,但是有沒有任何函數可以讓您在指定的時間間隔內平均?比如我想這麼像下面這樣:有沒有辦法在Big Query中進行滾動平均?

SELECT 
    city 
    AVG(temperature) OVER(PARTITION BY city, INTERVAL day,14, ORDER BY day) as rolling_avg_14_days, 
    AVG(temperature) OVER(PARTITION BY city, INTERVAL day,30, ORDER BY day) as rolling_avg_30_days, 
WHERE 
    city IN ("Los Angeles","Chicago","Sun Prairie","Sunnyvale") 
    AND year BETWEEN 1900 AND 2013 

我想要做的滾動平均值計算,讓我來指定一個範圍值超過做一個聚合函數,什麼價值按順序排列。平均函數將採用當前的日溫和前13天(或之前的29天)來計算和平均。今天這可能嗎?我知道如果我在SELECT語句中放置13個LAG/OVER字段,然後平均所有這些字段的結果,我可以做類似這樣的事情,但這是很大的開銷。

+0

我確實找到了一個[上一篇文章](http://stackoverflow.com/questions/12763404/bigquery-moving-average)fr om約旦關於使用JOIN來產生滾動平均值。我嘗試過使用這種邏輯,它的效果很好,但是我想知道是否在開發中有一個窗口函數會使邏輯更簡單一些。 –

回答

0

不同的選項與JOIN EACH(這可太緩慢,因爲一個非常大的數據量可以在中間步驟獲取生成):

SELECT a.SensorId SensorId, a.Timestamp, AVG(b.Data) AS avg_prev_hour_load 
FROM (
    SELECT * FROM [io_sensor_data.moscone_io13] 
    WHERE SensorId = 'XBee_40670EB0/mic') a 
JOIN EACH [io_sensor_data.moscone_io13] b 
ON a.SensorId = b.SensorId 
WHERE b.Timestamp BETWEEN (a.Timestamp - 36000000) AND a.Timestamp 
GROUP BY SensorId, a.Timestamp; 

(基於喬·塞科的SQL問題)

對於窗口函數,有一個實現更大範圍可能是有用的,但現在我會自動生成查詢。

5

我覺得OVER with RANGE建設Window Functions是最適合在這裏

假設日子場被表示爲「YYYY-MM-DD」格式,下面的查詢做滾動平均值

SELECT 
    city, 
    day, 
    AVG(temperature) OVER(PARTITION BY city ORDER BY ts 
       RANGE BETWEEN 14*24*3600 PRECEDING AND CURRENT ROW) AS rolling_avg_14_days, 
    AVG(temperature) OVER(PARTITION BY city ORDER BY ts 
       RANGE BETWEEN 30*24*3600 PRECEDING AND CURRENT ROW) AS rolling_avg_30_days 
FROM (
    SELECT day, city, temperature, TIMESTAMP_TO_SEC(TIMESTAMP(day)) AS ts 
    FROM temperatures 
) 

你最有可能早就發現了這個解決方案,但仍然希望能有一個更好的答案(截至今天)在這裏對於這個問題

相關問題