当前位置: 首页 > 面试题库 >

BigQuery:如何在滚动时间戳窗口内对行进行分组和计数?

酆耀
2023-03-14
问题内容

我在MongoDB上有一些经验,并且正在学习BigQuery。我正在尝试执行以下任务,但我不知道如何使用BigQuery的标准SQL来执行此任务。

我有一张包含以下数据的表。它包含在不同网站URL上发生的事件。时间戳表示给定事件发生的时间。例如,第一行表示“事件’xx’发生在世界标准时间2016-10-18
15:55:16的URL’a.html’上。”

event_id |    url    |          timestamp   
-----------------------------------------------------------
   xx         a.html      2016-10-18 15:55:16 UTC
   xx         a.html      2016-10-19 16:68:55 UTC
   xx         a.html      2016-10-25 20:55:57 UTC
   yy         b.html      2016-10-18 15:58:09 UTC
   yy         a.html      2016-10-18 08:32:43 UTC
   zz         a.html      2016-10-20 04:44:22 UTC
   zz         c.html      2016-10-21 02:12:34 UTC

我想计算一个3天滚动窗口中每个网址上发生的每个事件的数量。换句话说,我希望能够说以下几点:

  • “在时间间隔[2016-10-18 00:00:00 UTC,2016-10-21 00:00:00 UTC)的url’a.html’上,事件’xx’发生了两次。”

  • “在时间间隔[2016-10-19 00:00:00 UTC,2016-10-22 00:00:00 UTC)的url’a.html’上,事件’xx’发生了一次。”

  • “在时间间隔[2016-10-20 00:00:00 UTC,2016-10-23 00:00:00 UTC)的url’a.html’上,事件’xx’发生了0次。” (注意:不需要将它作为一行返回。缺少此行可以表示该事件发生了0次。)

一些注意事项:我的数据库每天包含超过10万行,并且事件的发生情况各不相同。意思是,在1天之内,事件“ xx”将发生约10,000次,事件“
zz”将发生约0-2次。

鉴于我有限的SQL知识,我不想为结果表提供结构,因为我认为这可能会错误地限制可能的答案。谢谢!


问题答案:

以下是适用于BigQuery标准SQL的信息(请参阅启用标准SQL

我使用的ts是字段名称(而不是timestamp您的示例中的名称),并假定此字段为TIMESTAMP数据类型

WITH dailyAggregations AS (
  SELECT 
    DATE(ts) AS day, 
    url, 
    event_id, 
    UNIX_SECONDS(TIMESTAMP(DATE(ts))) AS sec, 
    COUNT(1) AS events 
  FROM yourTable
  GROUP BY day, url, event_id, sec
)
SELECT 
  url, event_id, day, events, 
  SUM(events) 
    OVER(PARTITION BY url, event_id ORDER BY sec 
      RANGE BETWEEN 259200 PRECEDING AND CURRENT ROW
  ) AS rolling3daysEvents
FROM dailyAggregations
-- ORDER BY url, event_id, day

259200的值实际上是3x24x3600,因此设置3天范围,因此您可以设置所需的任何实际滚动周期



 类似资料:
  • 问题内容: 这是一个扩展的一个问题,我问,并解决在计算器上这里。 我是BigQuery和SQL的新手,我想构建一个标准SQL查询,该查询将在X天的滚动时间内对事件进行分组和计数。我的数据表如下所示: 我正在跟踪网址上发生的事件。我想知道在X天的滚动时间内,每个事件在每个URL上发生了多少次。当我问这个问题时,我得到了一个很好的答案: 259200是3天,以秒为单位(3x24x3600)。据我了解,

  • 问题内容: 我是Postgres的新用户,我敢肯定已经有了答案,但是我找不到。 我需要分析活动日志表中的一些数据,并将结果按时间段分组。 一个简单的问题版本是一个包含三个字段的表: 我要捕获的操作字符串可能是“ create_entry”(是的,我知道这很不错,因为它的数据库设计不错,但我坚持使用它) 我正在寻找的输出是一个报告,该报告按年份和月份显示了“ create_entry”操作的计数。就

  • 我被要求做一个按升序对数组进行排序的程序。我这样做了: 输入不会超过10个数字。这可以用比我这里更少的代码完成吗?我希望代码尽可能短。任何帮助都将不胜感激。谢谢!

  • 我希望能够添加一个列,根据值按顺序计算行数。例如,下面是三个不同的人,他们的记录有时间戳。我想根据PersonID计算记录的顺序。这应该为每个PersonID重新启动。(我可以用Index()在Tableau中执行此操作,但我希望它也是原始文件的一部分) 有没有办法减去日期时间呢?我的方法是只选择顺序1作为数据帧,然后只选择顺序2,然后合并,然后减去。有没有一种方法可以自动完成?

  • 我有app,我有很多不同风格的按钮组件(我特意把它分开,以提高可读性),例如:普通、概述、文本、链接和其他。我想创建一个特殊的组件,在其中我将传递prop,component将返回我需要的按钮组件。现在我制作了这个组件,但我必须传递我可能不需要的道具。我如何解决这个问题,或者你知道分组的不同实现方式? 分组组件:

  • 问题内容: 我正在尝试返回每个月内的记录数,并将结果按月/年分组。 模式看起来像这样: 我一直在搜索,但无法获得预期的结果。谢谢。 问题答案: 格式化时间戳,然后将其分组。 按月分组: 按年份分组: 如果timestamp-field以unixtime- value的形式存储,请环绕该字段: