我对MongoDB有一些经验,而且我正在学习BigQuery。我正在尝试执行以下任务,并且我不知道如何使用BigQuery的标准SQL来执行此操作。
我有一张包含以下数据的表格。它包含在不同网站网址上发生的事件。时间戳表示给定事件发生的时间。例如,第一行表示“事件'xx'发生在2016-10-18 15:55:16 UTC的网址'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天窗口中每个网址上发生的每个事件的数量。换句话说,我希望能够说出以下内容:
“在网址'a.html'上,在间隔[2016-10-18 00:00:00 UTC,2016-10-21 00:00:00 UTC]期间,发生了'xx'事件两次“。
“在网址'a.html'上,在间隔[2016-10-19 00:00:00 UTC,2016-10-22 00:00:00 UTC]期间,发生了'xx'事件一次“。
“在网址'a.html'上,在[2016-10-20 00:00:00 UTC,2016-10-23 00:00:00 UTC]间隔期间,发生了'xx'事件零次。“ (注意:这不需要作为行返回。没有这一行可能意味着事件发生了零次。)
一些注意事项:我的数据库每天包含超过10万行,并且事件的发生会有所不同。意思是,在1天内,事件'xx'将发生~10,000次,事件'zz'将发生~0-2次。
鉴于我的SQL知识有限,我不想为结果表提供结构,因为我认为这可能会错误地限制可能的答案。谢谢!
答案 0 :(得分:2)
下面是BigQuery Standard SQL(请参阅Enabling Standard 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天范围,因此您可以设置所需的实际滚动周期