【问题标题】:Is there a way to do rolling averages in Big Query?有没有办法在 Big Query 中进行滚动平均值?
【发布时间】:2014-04-09 21:25:23
【问题描述】:

我知道 Big Query 中有一个 AVG 函数,并且有窗口函数可以将上一个或下一个值向上或向下移动,但是是否有任何函数可以让您在指定的时间间隔内进行平均?例如,我想这样做如下:

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 字段,然后对所有这些字段的结果进行平均,我可以做这样的事情,但这是很多开销。

【问题讨论】:

  • 我确实找到了来自 Jordan 的 previous post,关于使用 JOIN 生成滚动平均值。我尝试使用该逻辑并且效果很好,但是我想知道是否有开发中的窗口函数可以使逻辑更简单。

标签: google-bigquery


【解决方案1】:

使用 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;

(基于 Joe Celko 的 SQL 问题)

对于窗口函数,让一个实现更大范围的函数可能很有用,但现在我会自动生成查询。

【讨论】:

    【解决方案2】:

    我认为Window FunctionsOVER with RANGE 结构最适合这里

    假设日期字段表示为“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
    )
    

    您很可能很久以前就已经找到了这个解决方案,但仍然想在这里为这个问题提供我认为更好的答案(截至今天)

    【讨论】:

    • 这是旧语法
    • 首先 - 这是 2014 年的问题和 2016 年的答案 - 那么投票的意义何在!?其次 - 哪一部分是遗产!?我想你错了! - 如果您的意思是TIMESTAMP_TO_SEC,那么它不是焦点,也不是问题或答案!焦点是OVER with RANGE。无论如何...
    • 嗨,米哈伊尔,谢谢你的回答,我现在正在从中学习,以适应我目前的挑战。你能解释一下 14*24*3600 的部分吗?我知道14和30是占14天或30天。 24 和 3600 代表什么?
    • 24:每天 24 小时和 3600:每小时 3600 秒
    • 答案中的链接文档现在是旧版。这是更新的链接:cloud.google.com/bigquery/docs/reference/standard-sql/… 答案仍然相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2020-08-14
    • 2020-03-30
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多