如何在单条查询中结合DISTINCT与COUNT(*)?Hive单查询去重统计行数
在SQL中结合DISTINCT与COUNT(*)做数据统计
要在单条SQL里同时实现去重和行数统计,关键是把DISTINCT放到COUNT的括号内,而不是和COUNT(*)并列使用。
基础用法
统计单列去重后的行数,直接用COUNT(DISTINCT 列名):
SELECT COUNT(DISTINCT user_id) AS unique_user_count FROM user_logs;
如果需要基于多列组合去重(比如用户+日期的唯一组合),把多个列用逗号分隔放在DISTINCT后面:
SELECT COUNT(DISTINCT user_id, order_date) AS unique_user_order_count FROM order_records;
⚠️ 注意:别写成SELECT DISTINCT COUNT(*),这种写法只会返回全表总行数,因为COUNT(*)统计的是所有行,DISTINCT对单个数值没有去重作用,完全达不到预期效果。
Hive中去重并统计行数
Hive支持标准SQL的写法,同时针对大数据场景还有性能优化的方案:
方案1:标准COUNT(DISTINCT)
数据量不大时直接用,和通用SQL语法一致:
SELECT COUNT(DISTINCT user_id) AS unique_user_num FROM hive_table;
多列组合去重统计:
SELECT COUNT(DISTINCT user_id, product_id) AS unique_user_product FROM user_behavior;
方案2:GROUP BY + COUNT(1)优化
当数据量极大时,COUNT(DISTINCT)可能出现数据倾斜拖慢查询,这时可以先通过GROUP BY去重,再统计分组后的行数:
SELECT COUNT(1) AS unique_count FROM ( SELECT user_id FROM hive_table GROUP BY user_id ) tmp_table;
多列组合去重的话,GROUP BY后跟上对应的多个列即可:
SELECT COUNT(1) AS unique_count FROM ( SELECT user_id, product_id FROM user_behavior GROUP BY user_id, product_id ) tmp_table;
这种写法能更好地利用Hive的并行处理能力,缓解数据倾斜问题。
内容的提问来源于stack exchange,提问作者Muhammed Muzammil M S
相关产品推荐
相关产品推荐

