相关疑难解决方法(0)

有没有办法在Big Query中进行滚动平均?

我知道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
Run Code Online (Sandbox Code Playgroud)

我想进行滚动平均计算,允许我指定一系列值来执行聚合函数,以及要按什么值排序.平均函数将采用当前温度和之前的13天(或之前的29天)来计算和平均.今天有可能吗?我知道如果我在SELECT语句中放入13个LAG/OVER字段然后平均所有这些字段的结果,我可以做这样的事情,但这是很多开销.

google-bigquery

7
推荐指数
2
解决办法
3625
查看次数

用于滑动窗口聚合的Bigquery SQL

嗨我有一张看起来像这样的桌子

Date         Customer   Pageviews
2014/03/01   abc          5
2014/03/02   xyz          8
2014/03/03   abc          6
Run Code Online (Sandbox Code Playgroud)

我想获得按周分组的页面视图聚合,但显示过去30天的聚合 - (每周30天的窗口大小的滑动窗口聚合)

我正在使用google bigquery

编辑:戈登 - 你对"客户"的评论,实际上我需要的是稍微复杂一点,这就是为什么我把客户列入上表.我希望每周在30天的窗口中获得超过n次网页浏览量的客户数量.这样的事情

Date        Customers>10 pageviews in 30day window
2014/02/01  10
2014/02/08  5
2014/02/15  6
2014/02/22  15
Run Code Online (Sandbox Code Playgroud)

然而,为了保持简单,如果我只是得到一个滑动窗口聚合的网页浏览而忽略了客户,我会按照自己的方式工作.这样的事情

Date        count of pageviews in 30day window
2014/02/01  50
2014/02/08  55
2014/02/15  65
2014/02/22  75
Run Code Online (Sandbox Code Playgroud)

sql aggregate-functions moving-average sliding-window google-bigquery

7
推荐指数
1
解决办法
3043
查看次数

BigQuery:计算每个人的时间窗口聚合

给出Google BigQuery中的表格:

User  Timestamp 
A     TIMESTAMP(12/05/2015 12:05:01.8023)
B     TIMESTAMP(9/29/2015 12:15:01.0323)
B     TIMESTAMP(9/29/2015 13:05:01.0233)
A     TIMESTAMP(9/29/2015 14:05:01.0432)
C     TIMESTAMP(8/15/2015 5:05:01.0000)
B     TIMESTAMP(9/29/2015 14:06:01.0233)
A     TIMESTAMP(9/29/2015 14:06:01.0432)
Run Code Online (Sandbox Code Playgroud)

有一种简单的计算方法:

User  Maximum_Number_of_Events_this_User_Had_in_One_Hour  
A     2
B     3
C     1
Run Code Online (Sandbox Code Playgroud)

一小时的时间窗口是一个参数?

我试着通过构建LAG和分区函数来解决这两个问题:

用于28天滑动窗口聚合的BigQuery SQL(无需编写28行SQL)

用于滑动窗口聚合的Bigquery SQL

但是发现那些帖子太不相似,因为我没有找到每个时间窗口的人数,而是在一个时间窗口内找到每个人的最大事件数.

sql aggregate-functions window-functions google-bigquery

5
推荐指数
1
解决办法
2914
查看次数

窗口函数 Over 子句

在 Over Clause 文档中提到了“行”和“范围”。

OVER (
      [PARTITION BY <expr>]
      [ORDER BY <expr>]
      [ROWS <expr> | RANGE <expr>]
     )
Run Code Online (Sandbox Code Playgroud)

但是,我找不到关于它们的功能或任何使用示例的详细说明。有人可以解释一下它们是什么以及如何使用它们吗?

google-bigquery

4
推荐指数
1
解决办法
4365
查看次数

BigQuery:如何在窗口函数上合并 HLL 草图?(计算滚动窗口上的不同值)

示例相关表架构:

+---------------------------+-------------------+
| activity_date - TIMESTAMP | user_id - STRING  |
+---------------------------+-------------------+
| 2017-02-22 17:36:08 UTC   | fake_id_i24385787 |
+---------------------------+-------------------+
| 2017-02-22 04:27:08 UTC   | fake_id_234885747 |
+---------------------------+-------------------+
| 2017-02-22 08:36:08 UTC   | fake_id_i24385787 |
+---------------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

我需要在滚动时间段(90 天)内对大型数据集的活跃不同用户进行计数,并且由于数据集的大小而遇到问题。

起初,我尝试使用窗口函数,类似于这里的答案。 /sf/answers/1930213211/

WITH
  daily AS (
  SELECT
    DATE(activity_date) day,
    user_id
  FROM
    `fake-table`)
SELECT
  day,
  SUM(APPROX_COUNT_DISTINCT(user_id)) OVER (ORDER BY day ROWS BETWEEN 89 PRECEDING AND CURRENT ROW) ninty_day_window_apprx
FROM
  daily
GROUP BY
  1
ORDER BY
  1 DESC
Run Code Online (Sandbox Code Playgroud)

然而,这会导致每天获得不同数量的用户,然后将它们相加 - 但如果它们出现多次,则可以在窗口内复制不同的用户。因此,这并不是对 90 天内不同用户的真正准确衡量。

我尝试的下一件事是使用以下解决方案 …

sql google-bigquery hyperloglog

3
推荐指数
1
解决办法
773
查看次数