sql - 用于滑动窗口聚合的 Bigquery SQL

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

嗨,我有一张看起来像这样的 table

Date         Customer   Pageviews
2014/03/01   abc          5
2014/03/02   xyz          8
2014/03/03   abc          6

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

我正在使用谷歌 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

然而,为了简单起见,如果我能得到一个滑动窗口的综合浏览量而完全忽略客户,我会按照我的方式工作。像这样的东西
Date        count of pageviews in 30day window
2014/02/01  50
2014/02/08  55
2014/02/15  65
2014/02/22  75

最佳答案

这个怎么样:

SELECT changes + changes1 + changes2 + changes3 changes28days, login, USEC_TO_TIMESTAMP(week)
FROM (
  SELECT changes,
         LAG(changes, 1) OVER (PARTITION BY login ORDER BY week) changes1,
         LAG(changes, 2) OVER (PARTITION BY login ORDER BY week) changes2,
         LAG(changes, 3) OVER (PARTITION BY login ORDER BY week) changes3,
         login,
         week
  FROM (
    SELECT SUM(payload_pull_request_changed_files) changes, 
           UTC_USEC_TO_WEEK(created_at, 1) week,
           actor_attributes_login login,
    FROM [publicdata:samples.github_timeline]
    WHERE payload_pull_request_changed_files > 0
    GROUP BY week, login
))
HAVING changes28days > 0

对于每个用户,它会计算他们每周提交的更改数量。然后使用 LAG() 我们可以查看下一行,他们在 -1、-2 和 -3 周提交了多少更改。然后我们将这 4 周相加,看看在过去 28 天内提交了多少更改。

现在,您可以将所有内容都包装在一个新查询中,以过滤具有更改 > X 的用户,并对其进行计数。

关于sql - 用于滑动窗口聚合的 Bigquery SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415647/

相关文章:

r - 使用 BigQuery 和 R 分析数据

php - 对从数据库中获取的表名称进行排序。 PHP 数据库

php - 如何在使用 PHP 插入之前检查重复行

sql - 根据条件使用不同的字段

sql - Postgresql 求直线斜率并强制通过原点的方法

sql - 除 Oracle 之外的 RDBMS 中的 CONNECT BY 或分层查询

mysql - 在 MySQL 中选择下一个相关行

go - 将超过 7 天的数据插入分区的 BigQuery 表

java - 为集成测试模拟 Bigquery