技术需求:将默认交货日期替换为对应订单最新实际交货日期
需求说明
现有一张包含以下字段的业务表:
- 订单ID(Order ID)
- 交货日期(Delivery Date)
- 交货序列号(Delivery Sequence Number)
- 记录更新日期时间(Record Update Date & Time)
业务规则
- 产品在库待交付时,交货日期默认设为
'1999-12-31',表示尚未安排交货计划; - 产品确定交货计划后,记录会更新为实际交货日期;
- 每次修改记录时,系统自动插入新行并分配递增的交货序列号,同时记录本次更新的日期时间。
处理要求
将表中所有默认日期'1999-12-31'替换为对应订单的最新实际交货日期(即该订单中,在当前记录之前最后一次更新的非默认交货日期)。
解决方案(SQL实现)
利用窗口函数LAST_VALUE()结合条件筛选,按订单分组并按交货序列号排序(序列号递增代表记录更新顺序),实现默认日期的批量替换:
SELECT "订单ID(Order id)", "交货日期(Delivery date)", "交货序列号(delivery sequence)", "记录更新时间(record update dttm)", CASE WHEN "交货日期(Delivery date)" = '1999-12-31' THEN LAST_VALUE(CASE WHEN "交货日期(Delivery date)" != '1999-12-31' THEN "交货日期(Delivery date)" END) OVER (PARTITION BY "订单ID(Order id)" ORDER BY "交货序列号(delivery sequence)" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ELSE "交货日期(Delivery date)" END AS "预期输出(expected output)" FROM your_table_name;
代码说明
PARTITION BY "订单ID(Order id)":按订单独立处理,避免跨订单干扰;ORDER BY "交货序列号(delivery sequence)":按系统分配的序列号排序,确保按记录的实际更新顺序获取有效日期;LAST_VALUE(...):在当前行及之前的所有记录中,筛选出非默认值的交货日期,并取最后一个(即最新的有效交货日期);CASE语句:判断当前交货日期是否为默认值,是则替换为最新有效日期,否则保留原数据。
示例数据与预期输出
| 订单ID(Order id) | 交货日期(Delivery date) | 交货序列号(delivery sequence) | 记录更新时间(record update dttm) | 预期输出(expected output) |
|---|---|---|---|---|
| 1 | '2019-01-20' | 1 | '2019-01-10 10:00:00 AM' | '2019-01-20' |
| 1 | '2019-01-21' | 2 | '2019-01-10 11:00:00 AM' | '2019-01-21' |
| 1 | '1999-12-31' | 3 | '2019-01-11 13:00:00 AM' | '2019-01-21' |
| 1 | '1999-12-31' | 4 | '2019-01-12 13:30:00 PM' | '2019-01-21' |
| 1 | '2019-01-29' | 5 | '2019-01-13 09:00:00 AM' | '2019-01-29' |
| 2 | '2019-04-30' | 1 | '2019-04-29 09:00:00 AM' | '2019-04-30' |
| 2 | '2019-03-18' | 2 | '2019-04-30 11:00:00 AM' | '2019-03-18' |
| 2 | '1999-12-31' | 3 | '2019-04-30 13:00:00 AM' | '2019-03-18' |
| 2 | '2020-03-31' | 4 | '2019-05-01 13:30:00 PM' | '2020-03-31' |
| 2 | '1999-12-31' | 5 | '2019-05-13 10:00:00 AM' | '2020-03-31' |
| 2 | '1999-12-31' | 6 | '2019-05-13 10:00:00 AM' | '2020-03-31' |
| 2 | '1999-12-31' | 7 | '2019-05-14 10:00:00 AM' | '2020-03-31' |
| 3 | '2019-01-20' | 1 | '2019-01-20 10:00:00 AM' | '2019-01-20' |
| 3 | '1999-12-31' | 2 | '2019-01-10 10:00:00 AM' | '2019-01-20' |
| 3 | '2019-01-22' | 3 | '2019-01-10 11:00:00 AM' | '2019-01-22' |
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

