确定跨度的开始/结束时间
Posted
技术标签:
【中文标题】确定跨度的开始/结束时间【英文标题】:Determine start/end times for spans 【发布时间】:2020-11-18 20:59:00 【问题描述】:总结: 我有一个表,其中包含来自销售订单状态跟踪应用程序的以下字段 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)。 第二个输出记录遵循相同的逻辑。我看到一篇提到 dbfiddle 和 WOW 的帖子 - 希望这会让事情变得更容易。
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a5674f4a7125f53c0436f9daa0807226
【问题讨论】:
摩根,您能否澄清一下,您到底想报告什么?您的描述说“...报告任何 SalesOrder 处于任何状态的总期间...”。您的示例显示 3 个状态(未结、保留、已确认)、3 个销售订单(1、2、3),而输出只有两行。您是如何获得这些行的,“开始”和“结束”的逻辑是什么?值 1 和 2 是如何得出的? 您要按机会ID 或销售订单分组吗?不知道您的数据,我会假设前 3 条记录是一个机会,而后两条记录是另一个机会? 正确,按机会 ID 分组,但所有 5 条记录都针对同一个机会 - 这使得这变得复杂。 soID 来自更高级别的销售订单表吗? TLDR 版本:肯定的。提供视图的桌子是静态的和平坦的。长版:我们有一个没有自动版本/审核历史记录的销售订单表。我们正在实施一个 SQL 触发器来创建审计历史记录,这样我们就可以跟踪过程中的哪些问题。除了时间戳之外,触发器还将新旧状态值缓存到自定义/平面表中。 【参考方案1】:你学到的东西 -
这恰好是“差距和孤岛”问题。以下是一些偶然发现我措辞不当的标题的其他人的参考资料。
https://dba.stackexchange.com/questions/56593/getting-each-status-change-in-a-table
https://bertwagner.com/posts/gaps-and-islands/
【讨论】:
更具体一点你是如何解决你自己的问题的。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 谢谢 - 我正在努力让 SQL 脚本在答案中存储格式并放弃。看看我做错了什么,现在已经解决了。谢谢大家。以上是关于确定跨度的开始/结束时间的主要内容,如果未能解决你的问题,请参考以下文章
如何将 GridLayoutManager 中的项目固定为具有不同跨度计数的父项的开始和结束