[英]Calculate time difference between adjacent rows
我有以下表格格式
ID Status Date
16 In Review 2017-07-03 08:23:11.000
16 Approved 2017-07-03 08:23:20.000
16 Approved 2017-07-11 10:34:27.000
我正在嘗試將In Review和Approved之間的時間差設置為9秒。
這是它的代碼
select avg(avg_bid_diff)
from (select bid, avg(diff*1.0) as avg_bid_diff
from (select bid, appid,
datediff(second, min(starttime), max(statustime)) as diff
from t
where appstatus in ('In Review', 'Approved')
group by bid, appid
having count(*) = 2
) ba
group by bid
) b;
問題是,當考慮最小和最大時,我得到了第一行和第三行之間的時間差,並且只有兩個狀態時,但我需要的是“首次審核”與下一個“批准”之間的時間差
有人可以告訴我如何更改查詢以獲取下一個批准的時差。
謝謝
這有點棘手,但到目前為止似乎還不錯。 唯一的限制是,對於每個唯一的(BidID,AppID)對,都沒有或狀態為“正在審核”的記錄。
我對鏈式CTE使用了完全不同的方法:
DECLARE @table TABLE
(
BidID int,
AppID int,
AppStatus nvarchar(20),
StatusTime DATETIME2
);
INSERT INTO @table (BidID, AppID, AppStatus, StatusTime)
VALUES
(1, 1, 'In Review', '2019-01-02 12:00:00'),
(1, 1, 'Approved', '2019-01-02 13:00:00'),
(1, 1, 'Approved', '2019-01-02 13:30:00'),
(1, 2, 'In Review', '2019-01-04 13:00:00'),
(1, 2, 'Approved', '2019-01-04 15:00:00'),
(2, 2, 'Approved', '2019-01-07 14:30:00'),
(2, 2, 'In Review', '2019-01-07 15:00:00'),
(2, 2, 'Approved', '2019-01-07 16:00:00'),
(3, 1, 'In Review', '2019-01-09 13:00:00'),
(4, 1, 'Approved', '2019-01-09 13:00:00');
;WITH OrderedRecords(BidID, AppID, AppStatus, StatusTime, [Order])
AS (
SELECT BidID
,AppID
,AppStatus
,StatusTime
, [Order] = ROW_NUMBER() OVER(PARTITION BY BidID, AppID ORDER BY StatusTime)
FROM @table
),
BidAverage(BidID, AveragePerBid)
AS (
SELECT OR1.BidID, AVG(CAST(DATEDIFF(HOUR, OR1.StatusTime, OR2.StatusTime) AS DECIMAL)) AS AveragePerBid
FROM OrderedRecords OR1
INNER JOIN OrderedRecords OR2
ON OR1.BidID = OR2.BidID AND OR1.AppID = OR2.AppID AND OR2.AppStatus = 'Approved' AND OR2.[Order] = OR1.[Order] + 1
WHERE OR1.AppStatus = 'In Review'
GROUP BY OR1.BidID
)
SELECT AVG(AveragePerBid) AS AveragePerTable
FROM BidAverage
AveragePerTable
---------------------------------------
1.250000
在這里,我嘗試解釋重要步驟:
每個BidID,AppID,StatusTime的記錄編號-這只是根據狀態顯示的時間對記錄進行編號(排序),並且每對(BidID,AppID)對都重新編號。
;WITH OrderedRecords(BidID, AppID, AppStatus, StatusTime, [Order]) AS ( SELECT BidID ,AppID ,AppStatus ,StatusTime , [Order] = ROW_NUMBER() OVER(PARTITION BY BidID, AppID ORDER BY StatusTime) FROM @table ) SELECT * FROM OrderedRecords BidID AppID AppStatus StatusTime Order ----------- ----------- -------------------- --------------------------- -------------------- 1 1 In Review 2019-01-02 12:00:00.0000000 1 1 1 Approved 2019-01-02 13:00:00.0000000 2 1 1 Approved 2019-01-02 13:30:00.0000000 3 1 2 In Review 2019-01-04 13:00:00.0000000 1 1 2 Approved 2019-01-04 15:00:00.0000000 2 2 2 Approved 2019-01-07 14:30:00.0000000 1 2 2 In Review 2019-01-07 15:00:00.0000000 2 2 2 Approved 2019-01-07 16:00:00.0000000 3 3 1 In Review 2019-01-09 13:00:00.0000000 1 4 1 Approved 2019-01-09 13:00:00.0000000 1
選擇正確的“正在審核”,“已批准”記錄對
基本上,內部選擇CTE BidAverage會從“ OrderedRecords” CTE中選擇所有“ InReview”記錄,並通過加入同一表來嘗試查找具有相同BidID,AppID和Order且比“ InReview”訂單高1的“已批准”記錄(這是獲得相鄰的“ In revw”和“ Approved”的技巧。INNER聯接會切斷“ In review”記錄,而沒有“ Approved”,反之亦然。
;WITH OrderedRecords(BidID, AppID, AppStatus, StatusTime, [Order])
AS (
SELECT BidID
,AppID
,AppStatus
,StatusTime
, [Order] = ROW_NUMBER() OVER(PARTITION BY BidID, AppID ORDER BY StatusTime)
FROM @table
)
SELECT OR1.BidID, OR1.AppID, OR1.AppStatus, OR1.StatusTime, OR1.[Order], OR2.AppStatus, OR2.StatusTime, OR2.[Order]
FROM OrderedRecords OR1
INNER JOIN OrderedRecords OR2
ON OR1.BidID = OR2.BidID AND OR1.AppID = OR2.AppID AND OR2.AppStatus = 'Approved' AND OR2.[Order] = OR1.[Order] + 1
WHERE OR1.AppStatus = 'In Review'
BidID AppID AppStatus StatusTime Order AppStatus StatusTime Order
----------- ----------- -------------------- --------------------------- -------------------- -------------------- --------------------------- --------------------
1 1 In Review 2019-01-02 12:00:00.0000000 1 Approved 2019-01-02 13:00:00.0000000 2
1 2 In Review 2019-01-04 13:00:00.0000000 1 Approved 2019-01-04 15:00:00.0000000 2
2 2 In Review 2019-01-07 15:00:00.0000000 2 Approved 2019-01-07 16:00:00.0000000 3
將所有這些放在一起時(此答案頂部的最終腳本),您將獲得所需的東西。 如上所述,這里的限制是每個BidID和AppID只有一個“審核中”記錄。 (但是可以有多個“已批准”,並且“審核中”不必是第一個)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.