如何按Numeric Date分组填充Start Date字段的NULL值?
需求说明
按**数字日期(Numeric Date)分组,将每组中存在的非空开始日期(Start Date)**值,填充至同组内开始日期字段的NULL值中。
注意事项
数字日期与开始日期数值不匹配,无法通过dateadd(day, [Numeric Date], '1840-12-31')结合CASE语句实现需求。
现有数据
| 订单ID(Order ID) | 数字日期(Numeric Date) | 数字日期ID(Numeric Date ID) | 开始日期(Start Date) |
|---|---|---|---|
| 478421 | 65934 | 65934 | NULL |
| 478421 | 65934 | 65934.01 | 7/25/2021 |
| 478421 | 65934 | 65934.02 | NULL |
| 478421 | 65934 | 65934.03 | NULL |
| 478421 | 65934 | 65934.05 | NULL |
| 478421 | 65967 | 65967 | NULL |
| 478421 | 65967 | 65967.02 | NULL |
| 478421 | 65967 | 65967.03 | 8/7/2021 |
| 478421 | 65967 | 65967.05 | NULL |
| 478421 | 65967 | 65967.05 | NULL |
| 478421 | 65967 | 65967.05 | NULL |
期望结果
| 订单ID | 数字日期 | 数字日期ID | 开始日期 |
|---|---|---|---|
| 478421 | 65934 | 65934 | 7/25/2021 |
| 478421 | 65934 | 65934.01 | 7/25/2021 |
| 478421 | 65934 | 65934.02 | 7/25/2021 |
| 478421 | 65934 | 65934.03 | 7/25/2021 |
| 478421 | 65934 | 65934.05 | 7/25/2021 |
| 478421 | 65967 | 65967 | 8/7/2021 |
| 478421 | 65967 | 65967.02 | 8/7/2021 |
| 478421 | 65967 | 65967.03 | 8/7/2021 |
| 478421 | 65967 | 65967.05 | 8/7/2021 |
| 478421 | 65967 | 65967.05 | 8/7/2021 |
| 478421 | 65967 | 65967.05 | 8/7/2021 |
当前使用的SQL代码
SELECT DISTINCT [Order ID] ,LEFT([Numeric Date ID], 5) 'Numeric Date' ,[Numeric Date ID] ,[Start Date] FROM Orders WHERE [Order ID] = '478421'
解决方案
使用窗口函数MAX()配合PARTITION BY按数字日期分组,提取每组内非空的开始日期填充NULL值:
SELECT [Order ID] AS 订单ID, [Numeric Date] AS 数字日期, [Numeric Date ID] AS 数字日期ID, MAX([Start Date]) OVER (PARTITION BY [Numeric Date]) AS 开始日期 FROM Orders WHERE [Order ID] = '478421'
代码说明
PARTITION BY [Numeric Date]:按数字日期字段分组MAX([Start Date]):自动忽略NULL值,获取每组内唯一的非空开始日期- 无需
DISTINCT:保留原数据的所有行,符合期望结果的行数要求
内容的提问来源于stack exchange,提问作者JPSeagull
相关产品推荐
相关产品推荐

