Con*_*ean 4 sql aggregate-functions google-bigquery
我有一个用户事件表,我想将这些事件投影到一个带有一些谓词的新列中,然后将每个用户的事件聚合到一个新的投影中,该投影告诉我用户是否曾经有过与他们匹配的谓词,或者如果他们从未匹配过,等等。
在其他语言中,这通常被称为all()and 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
Run Code Online (Sandbox Code Playgroud)
它利用了max(true, false, false)yielding的行为true,因此您可以实现any并all通过在列中搜索值然后从那里构建。
这是我必须依赖的技巧还是 BigQuery 支持布尔聚合?
万一其他人偶然发现了这一点,标准 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;
Run Code Online (Sandbox Code Playgroud)
是的,BigQuery 有这样的聚合函数,它为它们使用 SQL 标准名称:
EVERY (will do logical and)
SOME (will do logical or)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4204 次 |
| 最近记录: |