0

摘要:我有一个表,其中包含来自销售订单状态跟踪应用程序 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

4

1 回答 1

0

你学到的东西——

这恰好是“差距和孤岛”问题。以下是一些偶然发现我措辞不当的标题的其他人的参考资料。

https://dba.stackexchange.com/questions/56593/getting-each-status-change-in-a-table

https://bertwagner.com/posts/gaps-and-islands/

于 2020-11-20T14:53:39.727 回答