You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单条查询中结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:03:27