计算多次出现的两行之间的时间差

问题描述 投票:0回答:1

我正在研究将是一个新函数,但是我试图建立一个基础,以计算每次出现在其他两列中的值出现时(两行之间的时差)(prev_value,current_value)。然后,将差值包装在一个总和中,以获得每个ID的最终值。

下面的示例只是表的一小部分,因此,如果我们使用ID 194422,希望我能理解我的观点。

我要计算的Datediff将在每个具有Current_Value 12026和Prev_Value 12026的记录之间。因此,在前2行之间,我希望有3分钟的差异,在3行和4行之间,我希望是4分钟差。

如果该行包含current_value和prev_value为12026,那么我也将其包括在时间中,因此在第13,14,15行中,我希望第13和15行之间相差9分钟。

然后我将通过ID对这些结果进行分组和求和。

ROWID|  ID   | Columnname | prev_value |     current_value  |      OperationTime


1    |197684 |  STATUSID  |    1       |     12026          |     2020-02-11 13:37:00.0010
2    |197684 |  STATUSID  | 12026      |       1            |     2020-02-11 13:40:00.000
3    |197684 |  STATUSID  |    1       |     12026          |     2020-02-11 13:44:00.000
4    |197684 |  STATUSID  | 12026      |       1            |     2020-02-11 13:48:00.000
5    |198662 |  STATUSID  |    1       |     12026          |     2020-02-24 15:10:00.000
6    |198662 |  STATUSID  | 12026      |       1            |     2020-02-24 15:20:00.000
7    |198662 |  STATUSID  |    1       |     12026          |     2020-02-24 15:23:00.000
8    |198662 |  STATUSID  | 12026      |       1            |     2020-02-24 15:41:00.000
9    |198662 |  STATUSID  |    1       |     12026          |     2020-02-24 16:24:00.000
10   |198662 |  STATUSID  | 12026      |       1            |     2020-02-24 17:05:00.000
11   |194422 |  STATUSID  |    1       |     12026          |     2020-02-25 09:04:00.000
12   |194422 |  STATUSID  | 12026      |       8            |     2020-02-25 09:07:00.000
13   |198662 |  STATUSID  |    1       |     12026          |     2020-02-26 15:32:00.000
14   |198662 |  STATUSID  | 12026      |     12026          |     2020-02-26 15:40:00.000
15   |198662 |  STATUSID  | 12026      |       1            |     2020-02-26 15:41:00.000
16   |194422 |  STATUSID  |    1       |     12026          |     2020-03-02 16:06:00.000
17   |194422 |  STATUSID  | 12026      |       8            |     2020-03-02 16:15:00.000

最终结果将是:

      RowID |  TimeSpent(Mins)

    194422  |     9
    197684  |     7
    198662  |     78

我现在尝试了几种不同的方法,但是记录丢失或检索的时间不正确。

我看过一个CTE,在CTE上有一个INNER和LEFT JOIN和OUTER JOIN,我尝试了两个CTE,在所有示例中,我都研究了LAG,RANK和ROW_NUMBER()。

下面的脚本可以正常工作,但是它不能提取我所有的结果,并且在此示例中,它缺少ID194422。

DECLARE @STATUSID INT 
SET @STATUSID = 12026 

;WITH CTE
     AS (SELECT prev_value, 
                current_value, 
                OPERATIONTIME,
                ROWID,
                ID,
            DENSE_RANK () OVER (PARTITION BY prev_value ORDER BY operationtime) AS ROWNUMBER  
         FROM   AUDITREVIEW
         WHERE  columnname = 'STATUSID' 
                AND ( current_value = @STATUSID 
                       OR prev_value = @STATUSID )    
                ) 

SELECT *,
    DATEDIFF(MINUTE,  CTE2.cte2OPERATIONTIME, CTE1.operationtime) as t
    INTO #Temp
FROM 
    CTE AS CTE1
OUTER APPLY 
        (SELECT  top 1
           prev_value as cte2prev_value, 
                current_value cte2current_value, 
                OPERATIONTIME cte2OPERATIONTIME,
                ROWID cte2rowID,
                ID cte2ID,
                DENSE_RANK () OVER ( ORDER BY operationtime) AS cte2ROWNUMBER 
            FROM CTE 
            WHERE CTE.ID = CTE1.ID 
            AND CTE.PREV_VALUE = CTE1.CURRENT_VALUE
            AND CTE.ROWNUMBER < CTE1.ROWNUMBER
            ORDER BY CTE.OPERATIONTIME DESC
            ) CTE2

--WHERE CTE1.WORKORDERID = 194422


SELECT SUM(t), ID
FROM #Temp
WHERE cte2prev_value <> @STATUSID
GROUP BY ID

DROP TABLE #Temp
sql-server common-table-expression datediff self-join
1个回答
0
投票

尝试以下操作:

© www.soinside.com 2019 - 2024. All rights reserved.