BigQuery:如何遍历id2值列表并在WHERE子句中使用变量,实现逐个统计id列去重数量
在BigQuery中按指定id2值分组统计唯一id数量
嗨,这个问题其实根本不用搞什么迭代查询,用GROUP BY就能轻松解决!你之前遇到的问题,是因为没给查询做分组,导致所有符合条件的id被揉在一起统计了总数。
基础解决方法:一次查询搞定所有统计
直接筛选出你关心的id2值,再按id2分组,每组单独计算对应id的去重数量,结果和你逐个执行查询完全一致,还高效得多:
SELECT id2, COUNT(DISTINCT id) AS unique_id_count FROM t1 WHERE id2 IN ('113', '50') GROUP BY id2
这个查询会返回两行结果:一行是id2='113'对应的唯一id数量,另一行是id2='50'对应的数量,完美匹配你要的“每个值单独统计”的需求。
进阶:确保所有指定id2都出现在结果里
如果你的需求是哪怕某个id2值在t1里没有对应数据,也要在结果中显示它,且计数为0,可以先构造包含目标id2的临时数据集,再和原表左连接统计:
WITH target_id2 AS ( SELECT '113' AS id2 UNION ALL SELECT '50' AS id2 ) SELECT t.id2, COUNT(DISTINCT t1.id) AS unique_id_count FROM target_id2 t LEFT JOIN t1 ON t.id2 = t1.id2 GROUP BY t.id2
比如如果'50'在t1里没有任何匹配行,结果里也会出现id2='50'且unique_id_count=0的记录,适合需要完整输出指定id2列表的场景。
为什么你之前的写法不对?
你之前用SELECT COUNT(DISTINCT(id)) FROM t1 WHERE id2 IN ('113', '50')得到的是总数,是因为这个查询把所有符合条件的id放在同一个集合里去重统计了——而GROUP BY id2就是告诉BigQuery:把数据按id2拆成一个个独立的小群体,每个群体单独计算统计值。
内容的提问来源于stack exchange,提问作者Wiseface
相关产品推荐
相关产品推荐

