如何使用SQL窗口函数填充表格同order_id的缺失Country值
填充同一订单ID下的Country缺失值
原始数据
| order_id | Products | Country |
|---|---|---|
| MB-123 | Bread | US |
| MB-123 | Milk | |
| MB-1256 | Cheese | UK |
| MB-1256 | Tomato Sauce | |
| MB-1256 | Milk |
需求说明
需将上述表格中Country列的缺失值,填充为对应同一order_id的Country名称。
期望结果
| order_id | Products | Country |
|---|---|---|
| MB-123 | Bread | US |
| MB-123 | Milk | US |
| MB-1256 | Cheese | UK |
| MB-1256 | Tomato Sauce | UK |
| MB-1256 | Milk | UK |
解决方案
可以利用窗口函数结合聚合函数提取每个订单ID对应的非空Country值,直接替换缺失值。以下是通用SQL写法,适配大多数主流数据库(PostgreSQL、MySQL 8.0+、SQL Server等):
SELECT order_id, Products, MAX(Country) OVER (PARTITION BY order_id) AS Country FROM your_table_name;
原理说明
PARTITION BY order_id:将数据按订单ID分组,确保只处理同一订单内的行。MAX(Country):在每个分组中自动忽略NULL值,提取唯一的非空Country值。- 窗口函数会将该值应用到分组内的每一行,自然填充所有缺失的Country字段。
如果需要结合COALESCE(逻辑等价,写法稍繁琐),也可以这样写:
SELECT order_id, Products, COALESCE(Country, MAX(Country) OVER (PARTITION BY order_id)) AS Country FROM your_table_name;
内容的提问来源于stack exchange,提问作者Dipak Kumar Singh
相关产品推荐
相关产品推荐

