如何计算 BigQuery 的滚动平均值

Posted

技术标签:

【中文标题】如何计算 BigQuery 的滚动平均值【英文标题】:How can I compute rolling average on BigQuery 【发布时间】:2019-08-14 12:58:56 【问题描述】:

我遇到了一个问题,我不确定如何在 Big Query 上计算它,我有一个表格,其中有一个用户吃过的香蕉数量以及他吃一些香蕉的相关日期:

+------+-------+--------------+
| user | banana|    date      |
+------+-------+--------------+
| a    |     5 |  2019/01/18  |
| .    |     ..|              |
| a    |     2 |  2019/05/18  |
| b    |     2 |  2019/02/18  |
| b    |     3 |  2019/03/18  |
| b    |     1 |  2019/03/18  |
+------+-------+--------------+

我想得到这样的东西:

+------+-------------+--------------------+----------------------+
| user | date  T     |AVG1st week before T|AVG2nd   week before T|
+------+-------------+--------------------+----------------------+
| a    | 2019/01/18  |  2                 |           1          |
| .    |     ..      |  ..                |           .          |
| a    | 2019/01/20  |  3                 |           1          |
| b    |     2       |  2                 |          2.5         |
| b    |     3       |  2                 |           5          |
| b    |     1       |  1                 |           2          |
+------+-------------+--------------------+----------------------+

其中“AVG 1st week before T”是用户在 T 前 7 天内每天消耗的香蕉的平均值。

我认为对于每一行,我都会计算“T 前 7 天”变量并创建“T 前 14 天”变量。然后在子查询中计算金额,但我认为这不是处理这个问题的最佳方式。

如果您有任何建议,我很乐意讨论!

提前谢谢你,

【问题讨论】:

【参考方案1】:

值得一读的东西Analytic Functions Concepts in Standard SQL

这是我想出的一个 sn-p,在当前行给出了过去 7 天“平均吃香蕉”。

SELECT
  user,
  banana,
  date,
  AVG(banana) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS avg
FROM
  `banana.banana`
WHERE
  user = 'a'

【讨论】:

您好,首先感谢您的回答,非常感谢。问题是我的数据是稀疏的,有些日期丢失了,想象一下两个日期之间有几天的间隔,如何考虑 sql 请求中的稀疏部分?经过一番搜索,我发现了这个:***.com/questions/49883311/... 但是如果 2 个日期之间的间隔大于窗口的大小,则它不起作用,在这种特定情况下,它将放置最后一行的值而不是平均值。如果你知道如何在不使用笛卡尔积的情况下做到这一点,我会很高兴听到这个消息,谢谢!

以上是关于如何计算 BigQuery 的滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery SQL:使滚动平均子查询或加入对大型数据集更有效

BigQuery:计算每日分区表中的平均值

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?

如何计算会话持续时间和平均值。 Google Analytics 原始数据中的会话持续时间?

如何在 Python 的滚动平均值计算中忽略 NaN