首页 > 解决方案 > 如何从确认列表中计算提前期

问题描述

我有一张表格,其中确认通过工厂内的操作处理的零件。

| PartNumber | Plant | OperationNumber | ConfirmationDate | ConfirmationTime |
| PartA      | Pl_A  | 300             | 2021-01-28       | 13:33:20         |
| PartB      | Pl_A  | 300             | 2021-01-28       | 13:33:20         |
| PartA      | Pl_A  | 500             | 2021-01-29       | 14:33:20         |
| PartB      | Pl_A  | 500             | 2021-01-29       | 14:33:20         |
| PartA      | Pl_A  | 800             | 2021-01-30       | 15:33:20         |
| PartB      | Pl_A  | 800             | 2021-01-30       | 15:33:20         |

我要返回的是该条目的唯一标识符(零件编号、工厂、操作编号)以及确认日期时间和最后一个条目的确认日期时间之间的差异(小于那个的最高操作编号)。

期望的输出:

| PartNumber | Plant | OperationNumber | LeadTime            | ConfirmationDateTime |
| PartA      | Pl_A  | 300             | NULL                | 2021-01-28 13:33:20  |
| PartA      | Pl_A  | 500             | 0000-00-01 01:00:00 | 2021-01-29 14:33:20  |
| PartA      | Pl_A  | 800             | 0000-00-01 01:00:00 | 2021-01-30 15:33:20  |
| PartB      | Pl_A  | 300             | NULL                | 2021-01-28 13:33:20  |
| PartB      | Pl_A  | 500             | 0000-00-01 01:00:00 | 2021-01-29 14:33:20  |
| PartB      | Pl_A  | 800             | 0000-00-01 01:00:00 | 2021-01-30 15:33:20  |

标签: sqlsql-servertsql

解决方案


SQL Server 没有时间跨度数据类型 - 因此处理查询以获取您的输出格式0000-00-01 01:00:00需要使用函数 - 有一些示例很容易找到,因此将这部分留给您。

使用 LAG 函数获取基线信息

SELECT PartNumber,
   Plant,
   OperationNumber,
   CAST(ConfirmationDate as datetime) + CAST(ConfirmationTime as datetime),
   DATEDIFF(second, LAG(CAST(ConfirmationDate as datetime) + CAST(ConfirmationTime as datetime)) OVER (PARTITION BY PartNumber ORDER BY OperationNumber), (CAST(ConfirmationDate as datetime) + CAST(ConfirmationTime as datetime)))
FROM <your table>

推荐阅读