我有一个用户事件表,我想将这些事件投射到一个 带有一些谓词的新列,然后将每个用户的事件聚合在一起 进入一个新的投影,告诉我用户是否有过谓词匹配 对于他们,或者他们从来没有匹配等等。
在其他语言中,通常称为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
的行为,因此您可以通过在列中搜索值来实现any
和all
的实现,然后从那里建造。
这是我必须依赖的hack还是BigQuery支持布尔聚合?
答案 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;