BigQuery - 计算滑动时间范围内的事件数

Posted

技术标签:

【中文标题】BigQuery - 计算滑动时间范围内的事件数【英文标题】:BigQuery - counting number of events within a sliding time frame 【发布时间】:2014-11-19 12:38:30 【问题描述】:

我想计算滑动时间范围内的事件数。

例如,假设我想知道过去 1000 秒内对 Google 股票 (GOOG) 的出价次数。

我正在尝试以下查询:

SELECT 
  symbol,
  start_date,
  start_time,
  bid_price,
  count(if(max(start_time)-start_time<1000,1,null)) over (partition by symbol order by start_time asc) cnt
FROM [bigquery-samples:nasdaq_stock_quotes.quotes] 
 where symbol = 'GOOG'

逻辑如下:分区窗口(按符号)按投标时间排序(为简单起见,不考虑投标日期)。 对于每个窗口(由窗口“头”处的行定义),我想计算 start_time 小于“头”行时间 1000 秒的行数。

我正在尝试使用 max(start_time) 来获取窗口中的第一行。这似乎不起作用,我收到一个错误:

Error: MAX is an analytic function and must be accompanied by an OVER clause.

是否可以在一列中有两个分析函数(在本例中为 count 和 max)?出现的问题是否有不同的解决方案?

【问题讨论】:

【参考方案1】:

尝试使用 range 函数。

SELECT  
 symbol,  
 start_date,  
 start_time,  
 bid_price,  
 count(market_center) over (partition by symbol order by start_time RANGE 1000 PRECEDING) cnt  
FROM [bigquery-samples:nasdaq_stock_quotes.quotes]   
where symbol = 'GOOG'  
order by 2, 3  

我使用 market_center 作为计数器,也可以使用其他字段。

注意:RANGE 函数未记录在 BigQuery 查询参考中,但它是一个标准 SQL 函数,在这种情况下似乎可以工作

【讨论】:

以上是关于BigQuery - 计算滑动时间范围内的事件数的主要内容,如果未能解决你的问题,请参考以下文章

在 Google BigQuery 中获取某个时间范围内的每周订阅明细

INNER JOIN 基于彼此范围内的公共时间戳的两个 BigQuery 表?

单元格滑动事件和事件内的按钮触摸

R语言计算时间窗口内的统计值(滑动平均滑动最大值滑动中位数滑动计数滑动总和等)实战

BigQuery 计算两个日期范围重叠

如何使用 BigQuery 计算 GitHub 上的推送事件?