SQL分组赋值需求:依据组内joined值统一设置final_joined列
实现分组统一赋值final_joined的SQL方案
需求说明
针对表1(包含group和joined列),生成表2的规则:
- 若某分组(
group)内任意行的joined值为Yes,则该分组所有行的final_joined统一为Yes - 若分组内所有行的
joined值均为No,则该分组所有行的final_joined统一为No
原始表(表1)
| group | joined |
|---|---|
| 1 | Yes |
| 1 | No |
| 1 | Yes |
| 2 | No |
| 2 | No |
| 3 | Yes |
| 3 | No |
目标表(表2)
| group | final_joined |
|---|---|
| 1 | Yes |
| 1 | Yes |
| 1 | Yes |
| 2 | No |
| 2 | No |
| 3 | Yes |
| 3 | Yes |
解决方案
以下提供几种通用的SQL实现方式,适用于大多数主流数据库(MySQL、PostgreSQL、SQL Server等):
方法1:使用窗口函数(推荐)
利用MAX()窗口函数,按group分组后取joined的最大值(字符串比较中Yes会大于No),直接得到分组的统一结果:
SELECT `group`, MAX(joined) OVER (PARTITION BY `group`) AS final_joined FROM 表1;
说明:窗口函数会保留原表的所有行,同时为每个分组计算统一的final_joined值,写法简洁高效。
方法2:子查询关联
先通过子查询统计每个分组的最终结果,再与原表关联:
SELECT t1.`group`, t2.final_joined FROM 表1 t1 JOIN ( SELECT `group`, CASE WHEN COUNT(CASE WHEN joined = 'Yes' THEN 1 END) > 0 THEN 'Yes' ELSE 'No' END AS final_joined FROM 表1 GROUP BY `group` ) t2 ON t1.`group` = t2.`group`;
说明:子查询先对每个分组判断是否存在Yes,再将结果关联回原表,适合不支持窗口函数的旧版数据库。
方法3:使用EXISTS判断
通过EXISTS子查询直接判断当前分组是否存在Yes记录:
SELECT `group`, CASE WHEN EXISTS (SELECT 1 FROM 表1 t2 WHERE t2.`group` = t1.`group` AND t2.joined = 'Yes') THEN 'Yes' ELSE 'No' END AS final_joined FROM 表1 t1;
说明:逐行判断当前分组是否有符合条件的记录,逻辑直观,适合小数据量场景。
内容的提问来源于stack exchange,提问作者yoyong555
相关产品推荐
相关产品推荐

