如何在SQL中按主键汇总行并根据值一致性生成布尔字段
验证重复主键下Val字段一致性判断的SQL逻辑
需求回顾
针对包含重复主键No的表格,实现以下判断逻辑:
- 同一
No对应的所有Val值完全相同时,Bool字段返回'No' - 同一
No对应的Val存在不同值时,Bool字段返回'Yes'
示例数据与预期结果
假设原始数据如下:
| No | Val |
|---|---|
| 1 | A |
| 1 | A |
| 2 | B |
| 2 | C |
| 3 | D |
预期输出结果:
| No | Bool |
|---|---|
| 1 | No |
| 2 | Yes |
| 3 | No |
验证你的SQL逻辑(假设第二个查询为以下语句)
如果你的第二个SQL查询是类似下面这种分组判断的写法:
SELECT No, CASE WHEN COUNT(DISTINCT Val) > 1 THEN 'Yes' ELSE 'No' END AS Bool FROM your_table GROUP BY No;
那这个逻辑是完全正确的,理由如下:
COUNT(DISTINCT Val)会统计每个No分组下不重复的Val值数量:- 当所有
Val值相同时(包括该No只有一条记录的情况),不重复值数量为1,触发ELSE分支返回'No' - 当存在至少两个不同的
Val值时,不重复值数量大于1,触发THEN分支返回'Yes'
- 当所有
- 额外场景覆盖:如果
Val字段包含NULL值,多数主流数据库(如MySQL、PostgreSQL)会将NULL视为一个独立的不重复值,比如某No下同时存在'A'和NULL,COUNT(DISTINCT Val)会返回2,逻辑依然能正确判断为'Yes'
内容的提问来源于stack exchange,提问作者T S Nandakumar
相关产品推荐
相关产品推荐

