PostgreSQL分组时忽略Null值(仅当Null为唯一值时保留)的统计需求
解决方案
思路
先标记每个Column1对应的Column2是否全为null,再按规则筛选数据后分组统计:
- 对每个
Column1计算其非null的Column2行数,若行数为0则说明该Column1的Column2全为null - 筛选出
Column2非null的行,或Column1全为null的行(保留这类行的null值) - 按
Column2分组,统计去重后的Column1数量
通用SQL实现(支持窗口函数的数据库:MySQL 8.0+/PostgreSQL/SQL Server等)
WITH cte AS ( SELECT Column1, Column2, -- 统计每个Column1对应的非null Column2行数 COUNT(Column2) OVER (PARTITION BY Column1) AS non_null_count FROM your_table ) SELECT Column2, COUNT(DISTINCT Column1) AS `Count Distinct Column1` FROM cte WHERE Column2 IS NOT NULL -- 只保留那些Column1全为null的行的null值 OR non_null_count = 0 GROUP BY Column2;
兼容旧版本数据库的实现(无窗口函数)
SELECT Column2, COUNT(DISTINCT Column1) AS `Count Distinct Column1` FROM ( SELECT t1.Column1, t1.Column2, -- 子查询统计每个Column1的非null Column2行数 (SELECT COUNT(Column2) FROM your_table t2 WHERE t2.Column1 = t1.Column1) AS non_null_count FROM your_table t1 ) sub WHERE Column2 IS NOT NULL OR non_null_count = 0 GROUP BY Column2;
结果验证
执行上述SQL后,会得到预期结果:
| Column2 | Count Distinct Column1 |
|---|---|
| x | 1 |
| y | 1 |
| (null) | 1 |
内容的提问来源于stack exchange,提问作者serghc
相关产品推荐
相关产品推荐

