是否存在单条SQL查询语句实现按列统计唯一值数量?
单条SQL语句统计各列唯一值数量
当然可以用单条SQL语句实现,核心是利用COUNT(DISTINCT)聚合函数,同时根据你对空值/空字符串的处理需求调整逻辑。
基础实现(排除NULL)
COUNT(DISTINCT 列名)会自动忽略NULL值,统计列中非NULL的唯一值数量,这是最常用的方式:
SELECT COUNT(DISTINCT Col1) AS col1_unique_count, COUNT(DISTINCT Col2) AS col2_unique_count_exclude_null, COUNT(DISTINCT Col3) AS col3_unique_count FROM your_table;
针对你的数据表,执行结果为:
col1_unique_count: 2(值a、b)col2_unique_count_exclude_null: 3(值1、2、3,NULL被排除)col3_unique_count: 4(值Z、empty、X、Y)
包含NULL的统计
如果需要把NULL视为一个独立的唯一值,可以用COALESCE将NULL替换为一个唯一占位符,让DISTINCT识别它:
SELECT COUNT(DISTINCT Col1) AS col1_unique_count, COUNT(DISTINCT COALESCE(Col2, '___NULL___')) AS col2_unique_count_include_null, COUNT(DISTINCT Col3) AS col3_unique_count FROM your_table;
此时col2_unique_count_include_null会返回4(包含NULL)。
自定义空字符串处理
如果需要排除特定的空字符串(比如示例中的empty),可以用CASE语句过滤:
SELECT COUNT(DISTINCT Col1) AS col1_unique_count, COUNT(DISTINCT Col2) AS col2_unique_count_exclude_null, COUNT(DISTINCT CASE WHEN Col3 != 'empty' THEN Col3 END) AS col3_unique_count_exclude_empty FROM your_table;
这里col3_unique_count_exclude_empty会返回3(排除empty后的值:Z、X、Y)。
为什么分组子句不对?
你尝试的分组(GROUP BY)是按行维度分组聚合,而我们需要的是对整个列的全局聚合,因此不需要GROUP BY,直接在SELECT中使用聚合函数即可。
内容的提问来源于stack exchange,提问作者PaulM
相关产品推荐
相关产品推荐

