如何通过SQL根据相同Col1值填充Col3的空值?
用同组非空值填充Col3空值的解决方案
原始数据
| Col 1. | Col 2 | Col 3 |
|---|---|---|
| Apple | 2021 | |
| Pears | 2021 | |
| Apple | 2020 | 2 |
| Pears | 2020 | 207 |
| Banana | 2017 | 272 |
期望结果
| Col 1. | Col 2 | Col 3 |
|---|---|---|
| Apple | 2021 | 2 |
| Pears | 2021 | 207 |
| Apple | 2020 | 2 |
| Pears | 2020 | 207 |
| Banana | 2017 | 272 |
方法1:窗口函数(推荐)
这是最简洁高效的方式,适用于支持窗口函数的现代SQL数据库(MySQL 8.0+、PostgreSQL、SQL Server等)。通过分组取同组非空Col3值来填充空值:
SELECT `Col 1.`, Col2, COALESCE(Col3, MAX(Col3) OVER (PARTITION BY `Col 1.`)) AS Col3 FROM your_table_name;
逻辑很直接:MAX(Col3) OVER (PARTITION BY \Col 1.`)会为每个Col 1.分组提取出该组的非空Col3值(每个分组只有一个非空值,MAX结果就是它),COALESCE`自动把空值替换成这个值,非空值保持原样。
方法2:修正自连接写法
如果你之前尝试自连接没成功,大概率是连接逻辑有问题。试试这个写法:
SELECT t1.`Col 1.`, t1.Col2, COALESCE(t1.Col3, t2.Col3) AS Col3 FROM your_table_name t1 LEFT JOIN ( -- 先筛选出每个分组的非空Col3值,确保每个分组只返回一行 SELECT `Col 1.`, MAX(Col3) AS Col3 FROM your_table_name WHERE Col3 IS NOT NULL GROUP BY `Col 1.` ) t2 ON t1.`Col 1.` = t2.`Col 1.`;
子查询先按Col 1.分组,取出每个组的非空Col3值(用MAX是为了避免分组有多个非空值时返回多行),然后左连接到原表,用COALESCE替换空值。
内容的提问来源于stack exchange,提问作者Yamini
相关产品推荐
相关产品推荐

