如何计算BigQuery中列的布尔聚合?

时间:2015-02-10 17:51:36

标签: sql aggregate-functions google-bigquery

我有一个用户事件表,我想将这些事件投射到一个 带有一些谓词的新列,然后将每个用户的事件聚合在一起 进入一个新的投影,告诉我用户是否有过谓词匹配 对于他们,或者他们从来没有匹配等等。

在其他语言中,通常称为all()any() 它是一个布尔值列表,它会告诉你它们是否匹配,或者是否匹配 至少一场比赛。它相当于在所有布尔值上使用布尔值AND 值(例如在all的情况下)或在所有布尔值上使用布尔OR 值(如any)。

BigQuery有这个功能吗?我可以使用max和它来近似它 min但它并不理想。

示例:

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的实现,然后从那里建造。

这是我必须依赖的hack还是BigQuery支持布尔聚合?

2 个答案:

答案 0 :(得分:4)

是的,BigQuery有这样的聚合函数,它使用SQL标准名称:

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

答案 1 :(得分:2)

如果其他人偶然发现这种情况,标准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;