PostgreSQL中实现无重复记录计数的方法求助
实现建议:去重后按SP计数
嘿,我来帮你搞定这个需求!从你的数据和期望结果来看,核心是先按SP、MA、NG这三个字段的组合去重(因为jame的三条记录这三个字段完全一致,不管SL值不同,都算同一组;而pink有两组不同的SP+MA+NG组合,所以计数是2),然后再按SP统计每组的数量。
下面给你几种不同的实现方式,适配不同的数据库场景:
1. 通用写法(所有数据库支持)
这种方式用子查询先取出唯一的SP+MA+NG组合,再分组计数,兼容性最好:
SELECT SP, COUNT(*) AS count FROM ( -- 先去重:保留唯一的SP、MA、NG组合 SELECT DISTINCT SP, MA, NG FROM your_table_name ) AS unique_records GROUP BY SP;
2. 简洁写法(支持多字段DISTINCT的数据库)
如果你的数据库支持多字段的COUNT(DISTINCT)(比如PostgreSQL、MySQL 8.0+、SQL Server等),可以用更简洁的语句:
PostgreSQL 版本
SELECT SP, COUNT(DISTINCT ROW(MA, NG)) AS count FROM your_table_name GROUP BY SP;
MySQL 版本
SELECT SP, COUNT(DISTINCT (MA, NG)) AS count FROM your_table_name GROUP BY SP;
通用多字段拼接写法(注意分隔符避坑)
如果你的数据库不支持直接对多字段用COUNT(DISTINCT),可以用拼接字段的方式,但要注意选择一个不会出现在MA/NG里的分隔符(比如|):
SELECT SP, COUNT(DISTINCT CONCAT(MA, '|', NG)) AS count FROM your_table_name GROUP BY SP;
结果验证
把以上语句中的your_table_name替换成你的实际表名,执行后就能得到你期望的结果:
SP count
jame 1
pink 2
内容的提问来源于stack exchange,提问作者mrbipbean
相关产品推荐
相关产品推荐

