2015-02-10 44 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;