2015-02-10 55 views
2

我有一个用户事件表,我想用一些谓词将这些事件投影到一个 新列中,然后将每个用户 的事件聚合到一个新的投影中,告诉我用户是否曾经谓词匹配 他们,或者他们从来没有与之相匹配等如何计算BigQuery中某列上的布尔聚合?

在其他语言中,这通常被称为all()any(),在那里你传递 它的布尔值的列表,如果所有它会告诉你的匹配,或者如果在 至少有一个匹配。相当于在所有布尔值 值(如all的情况下)上使用布尔值AND,或在所有布尔值 值(如any中)上使用布尔值OR

BigQuery是否具有此功能?我可以使用maxmin来近似它,但它并不理想。

例子:

select 
month(date_time) m, 
count(*) as ct, 
max(id_is_present), 
min(id_is_present), 
max(starts_with_one) max_one, 
min(starts_with_one) min_one, 
from 
(
    select 
    length(user_id) > 1 id_is_present, 
    regexp_match(user_id, r'^1') starts_with_one, 
    date_time 
    from 
    [user_events.2015_02] 
) 
group by 
m 

它利用的max(true, false, false)行为产生true,所以你可以排序的通过为值的列搜索,然后从那里建立实施anyall

这是我不得不依赖的破解或者BigQuery是否支持布尔聚合?

回答

3

是,BigQuery就会有这样的聚合功能,它使用SQL标准名称为他们:过这个

EVERY (will do logical and) 
SOME (will do logical or) 
1

万一别人绊倒,标准SQL提供logical_and()logical_or。所以,代码可以写成:

select month(date_time) as m, count(*) as ct, 
     logical_or(id_is_present), 
     logical_and(id_is_present), 
     logical_or(starts_with_one) as max_one, 
     logical_and(starts_with_one) min_one, 
from (select length(user_id) > 1 id_is_present, 
      regexp_match(user_id, r'^1') starts_with_one, 
      date_time 
     from [user_events.2015_02] 
    ) u 
group by m;