BigQuery中如何统计仅出现一次的唯一值(区分Count Distinct)
BigQuery 实现列值唯一频次统计方案
你需要先明确两类去重统计的差异:
COUNT(DISTINCT 列名):统计列去重后的所有不同值总数,对应示例数据集{A,A,A,B,B,B,C,D}的结果为4,覆盖A、B、C、D四个值- 仅出现一次的值的计数:统计在列中总共只出现过1次的值的总数,对应示例结果为2,覆盖C、D两个值,这是你需要实现的目标
实现逻辑
核心思路是先按目标列分组,计算每个不同值的出现频次,再筛选出频次等于1的值做计数。
可直接运行的SQL示例
1. 同时输出两类统计结果
以下代码用示例测试数据验证逻辑,替换成你的实际表名即可使用:
WITH test_data AS ( SELECT 'A' AS Letters UNION ALL SELECT 'A' UNION ALL SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'B' UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D' ) SELECT COUNT(DISTINCT Letters) AS count_distinct, COUNTIF(freq = 1) AS count_unique FROM ( SELECT Letters, COUNT(*) AS freq FROM test_data -- 替换为你的实际表名即可 GROUP BY Letters )
运行返回结果:
| count_distinct | count_unique |
|---|---|
| 4 | 2 |
2. 更简洁的单统计写法
如果只需要获取仅出现一次的值的总数,可以直接用HAVING子句过滤分组结果,写法更精简:
SELECT COUNT(*) AS count_unique FROM ( SELECT Letters FROM 你的实际表名 GROUP BY Letters HAVING COUNT(*) = 1 )
3. 查看所有仅出现一次的具体值
如果需要列出所有仅出现过一次的值本身,而非仅统计数量,可以用以下语句:
SELECT Letters AS single_occurrence_value FROM 你的实际表名 GROUP BY Letters HAVING COUNT(*) = 1
运行后会返回C、D两个值,和你的预期一致。
内容的提问来源于stack exchange,提问作者Vaiva
相关产品推荐
相关产品推荐

