BigQuery 选择时间间隔内的数据

Posted

技术标签:

【中文标题】BigQuery 选择时间间隔内的数据【英文标题】:BigQuery select data within a time interval 【发布时间】:2015-04-27 14:53:49 【问题描述】:

我的数据看起来像

名称|从 | To_City |申请日期

安迪|巴黎 |伦敦| 2014 年 8 月 21 日 12:00

莉娜 |科隆 |柏林 | 2014 年 8 月 22 日 18:00

安迪|巴黎 |伦敦 | 2014 年 8 月 22 日 06:00

丽莎 |罗马 |尼尔 | 2014 年 8 月 25 日 18:00

莉娜 |罗马 |伦敦 | 2014 年 8 月 21 日 20:00

丽莎 |罗马 |尼尔 | 2014 年 8 月 24 日 18:00

安迪|巴黎 |伦敦| 2014 年 8 月 25 日 12:00

我想知道一个人在 +/- 一天内有多少相同的驱动请求。我很想收到一张桌子,上面写着:

名称|从 | To_City |平均请求日期 | # 个请求

安迪|巴黎 |伦敦| 2014 年 8 月 21 日 21:00 | 2

莉娜 |科隆 |柏林 | 2014 年 8 月 22 日 18:00 | 1

丽莎 |罗马 |尼尔 | 2014 年 8 月 25 日 06:00 | 2

莉娜 |罗马 |伦敦 | 2014 年 8 月 21 日 20:00 | 1

安迪|巴黎 |伦敦| 2014 年 8 月 25 日 12:00 | 1

这将是 group by 子句的结果。但是,编写这样一个条件来检查在初始请求后的 24 小时内是否存在以及有多少相同的请求,通常是否可行? 到目前为止,我在 Excel 中下载数据并在那里进行操作,但是数据很多,因此效率不高...

样本数据:

让我们先构建一个示例数据集:

select * from (select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-21 12:00' as date),
(select 'Lena' as name,'Koln' as f,'Berlin' as to, '2014-08-22 18:00' as date),
(select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-22 06:00' as date),
(select 'Lisa' as name,'Rome' as f,'Neapel' as to, '2014-08-25 18:00' as date),
(select 'Lena' as name,'Rome' as f,'London' as to, '2014-08-21 20:00' as date),
(select 'Lisa' as name,'Rome' as f,'Neapel' as to, '2014-08-24 18:00' as date),
(select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-25 12:00' as date)

【问题讨论】:

【参考方案1】:

一种方法是在 RANGE 窗口中使用窗口函数。为此,需要将第一个日期转换为天数,因为 RANGE 要求排序列是连续数字。 PARTITION BY 子句类似于 GROUP BY - 它列出了定义“相同”驱动器请求的列(在您的情况下 - 名称,从和到)。然后您可以简单地使用 COUNT(*) 来计算该窗口内的天数。

select name, f, to, date, count(*) 
  over(partition by name, f, to
       order by day
       range between 1 preceding and 1 following) from (
select name, f, to, date, integer(timestamp(date)/1000000/60/60/24) day from
(select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-21 12:00' as date),
(select 'Lena' as name,'Koln' as f,'Berlin' as to, '2014-08-22 18:00' as date),
(select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-22 06:00' as date),
(select 'Lisa' as name,'Rome' as f,'Neapel' as to, '2014-08-25 18:00' as date),
(select 'Lena' as name,'Rome' as f,'London' as to, '2014-08-21 20:00' as date),
(select 'Lisa' as name,'Rome' as f,'Neapel' as to, '2014-08-24 18:00' as date),
(select 'Andy' as name,'Paris' as f,'London' as to, '2014-08-25 12:00' as date))

【讨论】:

【参考方案2】:

您可以截断日期以排除小时、分钟和秒。然后按该列分组

SELECT SUBSTR(STRING(date-of-request), 0, 9) AS day
FROM t1
GROUP BY day

【讨论】:

以上是关于BigQuery 选择时间间隔内的数据的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 隐藏 UDF 实现

如何加入 Firebase 和 BigQuery

BigQuery - 在插入表时调用查询

在 BigQuery 中恢复过期的 Firebase 表并将数据保存时间超过 60 天

将 BigQuery 结果与 FCM 结合使用

BigQuery:无效日期错误