SQL中GROUP BY非统计列时如何对两列进行COUNT DISTINCT统计
SQL需求实现方案
你提到的分组列和统计列不需要一致的顾虑是多余的,COUNT DISTINCT的统计范围为每个分组内的行,只需要统计分组内的对应字段即可,不需要和GROUP BY的字段相同,以下是不同场景的实现方式:
- 如果你使用支持多列COUNT DISTINCT语法的数据库(如PostgreSQL、MySQL 8.0+),可以直接写为:
SELECT p.Title FROM Person.Person p GROUP BY p.Title HAVING COUNT(DISTINCT (p.LastName, p.FirstName)) > 1
- 如果你使用SQL Server(AdventureWorks为SQL Server官方示例库)或者需要兼容所有SQL方言,可以使用拼接唯一分隔符的方式,注意分隔符要选择不会出现在姓名字段中的字符,避免拼接歧义:
SELECT p.Title FROM Person.Person p GROUP BY p.Title HAVING COUNT(DISTINCT CONCAT(p.LastName, '||', p.FirstName)) > 1
- 无歧义的通用兼容写法,先对全量数据做姓名+分组列去重,再分组统计:
SELECT Title FROM ( SELECT DISTINCT Title, LastName, FirstName FROM Person.Person ) t GROUP BY Title HAVING COUNT(*) > 1
内容的提问来源于stack exchange,提问作者JanT
相关产品推荐
相关产品推荐

