如何在SQL中按ID分组,将Type为wo的Case#同步至同ID所有行的wo Case#列
SQL查询实现:为同一ID新增对应Type为wo的Case#列
需求说明
现有表TableA,包含ID、Type、Case#列,原表数据如下:
原表数据(TableA)
| ID | Type | Case# |
|---|---|---|
| 101 | wo | 23 |
| 101 | tsk | 12 |
| 101 | tsk | 13 |
| 101 | tsk | 14 |
| 101 | tsk | 15 |
| 642 | wo | 500 |
| 642 | tsk | 34 |
| 642 | tsk | 35 |
| 642 | tsk | 36 |
| 642 | tsk | 37 |
需要新增wo Case#列,同一ID的所有行该列均取该ID下Type为wo的Case#值,期望结果如下:
期望查询结果
| ID | Type | Case# | wo Case# |
|---|---|---|---|
| 101 | wo | 23 | 23 |
| 101 | tsk | 12 | 23 |
| 101 | tsk | 13 | 23 |
| 101 | tsk | 14 | 23 |
| 101 | tsk | 15 | 23 |
| 642 | wo | 500 | 500 |
| 642 | tsk | 34 | 500 |
| 642 | tsk | 35 | 500 |
| 642 | tsk | 36 | 500 |
| 642 | tsk | 37 | 500 |
解决方案
方法1:窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等)
利用MAX()窗口函数按ID分组,提取对应Type='wo'的Case#值,对同一ID的所有行填充该值:
SELECT ID, Type, `Case#`, MAX(CASE WHEN Type = 'wo' THEN `Case#` END) OVER (PARTITION BY ID) AS `wo Case#` FROM TableA;
方法2:子查询关联
先查询每个ID对应的wo类型Case#,再与原表关联匹配:
SELECT a.ID, a.Type, a.`Case#`, wo.`Case#` AS `wo Case#` FROM TableA a JOIN ( SELECT ID, `Case#` FROM TableA WHERE Type = 'wo' ) wo ON a.ID = wo.ID;
方法3:自连接
将原表与自身按ID关联,筛选Type='wo'的记录匹配赋值:
SELECT a.ID, a.Type, a.`Case#`, b.`Case#` AS `wo Case#` FROM TableA a LEFT JOIN TableA b ON a.ID = b.ID AND b.Type = 'wo';
内容的提问来源于stack exchange,提问作者MGoyal
相关产品推荐
相关产品推荐

