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 表?