我知道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字段然后平均所有这些字段的结果,我可以做这样的事情,但这是很多开销.
嗨我有一张看起来像这样的桌子
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
给出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)
但是发现那些帖子太不相似,因为我没有找到每个时间窗口的人数,而是在一个时间窗口内找到每个人的最大事件数.
在 Over Clause 文档中提到了“行”和“范围”。
OVER (
[PARTITION BY <expr>]
[ORDER BY <expr>]
[ROWS <expr> | RANGE <expr>]
)
Run Code Online (Sandbox Code Playgroud)
但是,我找不到关于它们的功能或任何使用示例的详细说明。有人可以解释一下它们是什么以及如何使用它们吗?
示例相关表架构:
+---------------------------+-------------------+
| 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 天内不同用户的真正准确衡量。
我尝试的下一件事是使用以下解决方案 …