簡體   English   中英

計算相鄰行之間的時差

[英]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

在這里,我嘗試解釋重要步驟:

  1. 每個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 
  2. 選擇正確的“正在審核”,“已批准”記錄對

基本上,內部選擇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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM