PostgreSQL分组查询:统计含不同isin值的sval分组
PostgreSQL分组检查isin值差异解决方案
表结构
题目中的表定义如下:
create table t1(id,sval)as values (88, 'X129de') ,(4, 'YHK33e') ,(44, '1K4892') ,(53, 'YHK33e') ,(42, 'YHK33e') ,(2, '1K4892') ,(1, '1K4892') ,(99, 'X129de'); create table t2(id,isin)as values (88, 'XXXXXX') ,(4, 'UUUUUU') ,(44, 'IIIIII') ,(53, 'UUUUUU') ,(42, 'IIIIII') ,(2, 'UUUUUU') ,(1, 'UUUUUU') ,(99, 'XXXXXX');
1. 获取每个分组的isin差异判断结果
关联两张表后按sval分组,通过COUNT(DISTINCT isin)判断分组内是否存在不同的isin值:
SELECT t1.sval, CASE WHEN COUNT(DISTINCT t2.isin) > 1 THEN '存在不同isin值' ELSE '所有isin值一致' END AS 分组判断结果, COUNT(DISTINCT t2.isin) AS 唯一isin数量 FROM t1 INNER JOIN t2 ON t1.id = t2.id GROUP BY t1.sval;
执行结果:
| sval | 分组判断结果 | 唯一isin数量 |
|---|---|---|
| X129de | 所有isin值一致 | 1 |
| YHK33e | 存在不同isin值 | 2 |
| 1K4892 | 存在不同isin值 | 2 |
2. 统计存在不同isin值的分组数量
基于分组结果,过滤出存在差异的分组并统计总数:
SELECT COUNT(*) AS 存在差异的分组数 FROM ( SELECT t1.sval FROM t1 INNER JOIN t2 ON t1.id = t2.id GROUP BY t1.sval HAVING COUNT(DISTINCT t2.isin) > 1 ) AS filtered_groups;
执行结果:
| 存在差异的分组数 |
|---|
| 2 |
关键逻辑说明
INNER JOIN确保t1的每条记录都匹配到t2对应的isin值COUNT(DISTINCT t2.isin)统计分组内不重复的isin数量,大于1则表示分组内存在不同值HAVING子句过滤出存在差异的分组,外层查询统计这类分组的总数
内容的提问来源于stack exchange,提问作者kahhengchong
相关产品推荐
相关产品推荐

