我有一個具有以下結構的表。我正在使用 SQL Server 2016
| 密鑰 | 狀態日期 | 地位 | 狀態條目 ID |
|---|---|---|---|
| 1 | 2021-10-07 11:49:59.430 | 接受 | 7 |
| 2 | 2021-10-07 11:51:50.430 | 處理 | 7 |
| 3 | 2021-10-07 11:52:52.883 | 已派遣 | 7 |
| 4 | 2021-10-07 11:55:37.263 | 發表 | 7 |
請注意:這些狀態條目將始終按時間順序排列,但可以覆寫正常流程并直接跳轉到任何狀態。例如,從Accept我們甚至可以跳轉到Delivered狀態。
我想要實作的是一個結果,它向我們展示了兩個狀態之間的時間差異
例如 - 預期輸出是
EntryId Time_Approve Time_Process Time_Dispatch Time_Delivered
7 0 15 23 8
示例中需要注意的一件事是關于批準狀態,它在物理表中不可用。如果它只在計算中考慮它們。
我嘗試使用滯后和領先功能,但無法達到預期的結果。請幫忙
uj5u.com熱心網友回復:
首先使用條件聚合將 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
所有值都以秒為單位。轉換為小時/分鐘/秒是微不足道的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337060.html
標籤:sql sql-server 查询语句 sql-server-2016
下一篇:使用SQL進行登錄、注銷跟蹤
