SQL 服务器中特定状态的连续记录之间的时间差

Time difference between consecutive records for specific status in SQL Server

我有一个具有以下结构的 table。我正在使用 SQL Server 2016

pkey statusDate Status StatusEntryID
1 2021-10-07 11:49:59.430 Accept 7
2 2021-10-07 11:51:50.430 Processed 7
3 2021-10-07 11:52:52.883 Dispatched 7
4 2021-10-07 11:55:37.263 Delivered 7

请注意:这些状态条目将始终按时间顺序排列,但可以覆盖正常流程并直接跳转到任何状态。例如,我们甚至可以从 Accept 跳转到 Delivered 状态。

我想要达到的结果是显示两个州之间的时差

例如 - 预期输出是

EntryId   Time_Approve    Time_Process    Time_Dispatch Time_Delivered
7         0               15              23             8

示例中需要注意的一件事是关于批准状态,这在物理 table 中不可用。如果它只在计算中考虑它们。

我尝试使用 Lag 和 Lead 函数,但无法达到预期的结果。请帮助

首先使用条件聚合将4行转换为4列,然后使用COALESCE找到上一个状态的时间(必须以相反的顺序进行)。最后你使用 DATEDIFF:

WITH cte AS (
    SELECT StatusEntryID
         , t1 = MIN(CASE WHEN Status = 'Accept'     THEN StatusDate END)
         , t2 = MIN(CASE WHEN Status = 'Processed'  THEN StatusDate END)
         , t3 = MIN(CASE WHEN Status = 'Dispatched' THEN StatusDate END)
         , t4 = MIN(CASE WHEN Status = 'Delivered'  THEN StatusDate END)
    FROM t
    GROUP BY StatusEntryID
)
SELECT StatusEntryID
     , Time_Accept    = 0
     , Time_Process   = DATEDIFF(SECOND, t1, t2)
     , Time_Dispatch  = DATEDIFF(SECOND, COALESCE(t2, t1), t3)
     , Time_Delivered = DATEDIFF(SECOND, COALESCE(t3, t2, t1), t4)
FROM cte

所有值均以秒为单位。转换为 hour/minute/seconds 很简单。