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 很简单。
我有一个具有以下结构的 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 很简单。