如何为表中各SKU匹配对应行的下一个成本核算日期?
问题描述
我有一张记录产品(SKU)成本价格变更日期的数据表,需要为表添加Date_Next_Costed列,填入该SKU的下一次成本核算日期,形成类起止日期字段。当前查询仅能返回该SKU的最后一次成本核算日期,无法获取下一个日期,寻求解决方案。
示例数据表
| SKU | Cost | Date_Costed |
|---|---|---|
| R001 | £4.50 | 01/03/2023 |
| R002 | £3.82 | 01/03/2023 |
| R001 | £4.54 | 13/03/2023 |
| R004 | £1.92 | 13/03/2023 |
| R001 | £4.69 | 31/03/2023 |
期望结果
| SKU | Cost | Date_Costed | Date_Next_Costed |
|---|---|---|---|
| R001 | £4.50 | 01/03/2023 | 13/03/2023 |
| R002 | £3.82 | 01/03/2023 | 01/03/2023 |
| R001 | £4.54 | 13/03/2023 | 31/03/2023 |
| R004 | £1.92 | 13/03/2023 | 01/03/2023 |
| R001 | £4.69 | 31/03/2023 |
解决方案
使用SQL窗口函数LEAD()即可实现需求,该函数能在同一SKU分组内,按日期排序后获取下一行的成本核算日期。
基础逻辑实现(推荐)
如果希望无后续日期时返回NULL(更符合起止日期的逻辑定义),执行以下查询:
SELECT SKU, Cost, Date_Costed, LEAD(Date_Costed) OVER (PARTITION BY SKU ORDER BY Date_Costed) AS Date_Next_Costed FROM your_table_name;
PARTITION BY SKU:限定仅在当前SKU的范围内查找下一次日期ORDER BY Date_Costed:按核算日期升序排列,确保获取的是下一次的有效日期
匹配给定期望结果
若需要为仅有一条记录的SKU填充当前日期作为Date_Next_Costed,用COALESCE()处理LEAD()返回的NULL:
SELECT SKU, Cost, Date_Costed, COALESCE(LEAD(Date_Costed) OVER (PARTITION BY SKU ORDER BY Date_Costed), Date_Costed) AS Date_Next_Costed FROM your_table_name;
注:你给出的R004期望结果中Date_Next_Costed为01/03/2023(早于当前日期),推测是输入笔误,上述查询会为R004返回自身的13/03/2023,更符合业务逻辑。
内容的提问来源于stack exchange,提问作者Dominic Bell
相关产品推荐
相关产品推荐

