用于滑动窗口聚合的 Bigquery SQL

Posted

技术标签:

【中文标题】用于滑动窗口聚合的 Bigquery SQL【英文标题】:Bigquery SQL for sliding window aggregate 【发布时间】:2014-04-20 08:56:48 【问题描述】:

您好,我有一张这样的桌子

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

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

我正在使用谷歌大查询

编辑:戈登 - 重新评论您对“客户”的评论,实际上我需要的稍微复杂一点,这就是我将客户包括在上表中的原因。我希望获得每周在 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

【问题讨论】:

你能举例说明你想要的结果吗?例如,“客户”与任何事物有什么关系? 28 天窗口而不是 30 天呢?每周汇总效果更好 当然 - 28 天就可以了 【参考方案1】:

这个怎么样:

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,并计算他们。

【讨论】:

有没有一种直接的方法来获得更精细的频率,例如,每天而不是每周的运行总和,而无需执行 30 次延迟调用? Eric - 我认为答案是肯定的,但我不确定我是否理解你的问题。您可以将其作为单独的问题发布吗?谢谢! @FelipeHoffa - 我刚刚问了我认为 Eric 在问的问题。您的任何想法将不胜感激:***.com/questions/27557919/… 这在有空周时有效吗? LAG 不是基于时间戳,而是基于行。通常,像这样的时间查询需要加入日历表。【参考方案2】:

我创建了以下“Times”表:

Table Details: Dim_Periods
Schema
Date    TIMESTAMP   
Year    INTEGER         
Month   INTEGER         
day         INTEGER         
QUARTER INTEGER     
DAYOFWEEK   INTEGER     
MonthStart  TIMESTAMP   
MonthEnd    TIMESTAMP   
WeekStart   TIMESTAMP   
WeekEnd TIMESTAMP   
Back30Days  TIMESTAMP   -- the date 30 days before "Date"
Back7Days   TIMESTAMP   -- the date 7 days before "Date"

我使用这样的查询来处理“运行总和”

SELECT Date,Count(*) as MovingCNT
FROM

(SELECT Date,
                Back7Days 
                    FROM DWH.Dim_Periods  
                 where Date < timestamp(current_date()) AND
                             Date >= (DATE_ADD (CURRENT_TIMESTAMP(), -5, 'month'))
                )P
                CROSS JOIN EACH
    (SELECT repository_url,repository_created_at
    FROM publicdata:samples.github_timeline
                ) L
        WHERE timestamp(repository_created_at)>= Back7Days 
              AND timestamp(repository_created_at)<= Date

GROUP EACH BY Date

请注意,它也可用于“本月至今”、“周至今”、“30 天前”等聚合。 但是,性能并不是最好的,并且由于笛卡尔连接,查询可能需要一段时间才能处理较大的数据集。 希望这会有所帮助

【讨论】:

以上是关于用于滑动窗口聚合的 Bigquery SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?

02滑动窗口

滑动窗口模板

matlab上有滑动平均的函数吗?

R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法data.tabledplyr等方案计算滑动分组统计

三维矩阵的非重叠滑动窗和