摘要:我有一个表,其中包含来自销售订单状态跟踪应用程序 OpportunityID、SalesOrderID、CurrentStatus、PriorStatus、RevisionDateTime 的以下字段
我已经针对该表构建了一个视图,其中包含以下内容(使用 Lead 函数):OpportunityID、SalesOrderID、PriorStatus、CurrentStatus、startTime、endTime、duration(工作分钟)。
背景:
- Opportunity 和 SalesOrderID 之间存在 1:Many 关系
- 每个 SalesOrder 独立于其他相关的 SalesOrders 通过工作流程进行
- 当商机被取消时,所有基础的 SalesOrders 也被取消。
- 在任何时候,SalesOrder 都可以返回到工作流中的先前状态
需要:我需要报告任何 SalesOrder 处于任何状态的总期间。
数据样本
soID | opportunityID | lastStatus | statusName | startTime | endTime
-----+---------------+------------+------------+------------------+------------------
1 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/17/20 02:00PM
2 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/17/20 02:00PM
3 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/18/20 10:00AM
1 | Q1234 | Hold | Approved | 11/20/20 12:00PM | 11/21/20 08:00AM
2 | Q1234 | Confirmed | Approved | 11/21/20 12:00PM | 11/22/20 02:00PM
鉴于上面的例子,我需要 2 行的结果,开始/结束时间如下:
1: 11/17/2020 10:00 AM / 11/18/2020 10:00 AM
2: 11/20/2020 12:00 PM / 11/22/2020 12:00 PM
我几乎可以肯定我将不得不使用存储过程来生成所需的结果,但我被卡住了。任何指针?
为清晰起见进行修订:
- 唯一相关的“状态”字段是“状态名称”,忽略“最后状态”列。
- 所需的输出将包括 OpportunityID 以及开始和结束时间。
- 逻辑:
- SOID 1-3 都在初始实例的同一时间开始,但在不同的时间结束。该实例的最小开始时间将是报告的开始时间(例如 11/17 @ 10 AM),而该实例的最大结束时间将是报告的结束时间(11/18 @ 10 AM)。
- 第二个输出记录遵循相同的逻辑。
我看到一篇提到 db<>fiddle 和 WOW 的帖子——希望这会让事情变得更容易。
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a5674f4a7125f53c0436f9daa0807226