2014-12-03 38 views
0

我在嘗試執行t-sql,它能夠通過將連續行的日期時間值與其前一個日期時間值相減來執行一些計算。連續計算表中的行之間的值

例如:

   Col1       Col2 
------------------------------------------------------------------- 
row 1: | ENTRY_DOOR_CLOSE    | 2/12/2014 16:41:40:4140 
row 2: | EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN | 3/12/2014 16:41:40:4140 
row 3: | ENTRY_DOOR_CLOSE    | 4/12/2014 16:41:40:4140 
row 4: | EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN | 5/12/2014 16:41:40:4140 
-------------------------------------------------------------------- 

結果:

 Col1   Col2 
--------------------------------------------------------------------- 
Row 1: | Diff | Row2.DateTime - Row1.DateTime 
Row 2: | Diff | Row4.DateTime - Row3.DateTime 
--------------------------------------------------------------------- 

任何人都可以提出一個想法,以解決此問題?

+0

我想沒有人注意到你的日期值是將在'datediff'函數中拋出錯誤。幾秒鐘內就不能有4140 – 2014-12-03 10:17:12

回答

2

在SQL Server 2012+,你可以使用lead()功能:

select 'Diff' as col1, 
     datediff(second, col2, col2_next) as diff_in_seconds 
from (select t.*, lead(col2) over (order by col2) as col2_next 
     from table t 
    ) t 
where col1 = 'ENTRY_DOOR_CLOSE'; 

這假設值是交錯的,如問題。

0

只是想出了使用CTE可我沒有使用SQL 2K12

;WITH valuedTable AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY ScxxID, SxxID ORDER BY RecordTime) AS RowID 
     , ScxxID 
     , SxxID 
     , Exxx 
     , RecordTime 
     , ProcessName 
    FROM 
     database..xxx 
    WHERE 
     ProcessName = 'EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN' 
     OR 
      ProcessName = 'ENTRY_DOOR_CLOSE' 
) 
SELECT 
    valuedTable.ProcessName 
    , valuedTable.RecordTime 
    , nex.ProcessName 
    , nex.RecordTime 
    , DATEDIFF(S, valuedTable.RecordTime, nex.RecordTime) DIFF 
FROM 
    valuedTable 
INNER JOIN 
    (valuedTable nex ON nex.RowID = valuedTable.RowID + 1) 
    AND 
    (nex.ProcessName = 'EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN') 
0

,如果你使用SQL Server 2012解決我的問題的情況下 - 用這一個(你的表是有序的,但是這一次是variabile的太非有序表):

;WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY Col2) AS RN, Col1, Col2 
      FROM YourTable) 

    SELECT 'Diff' AS Col1, DATEDIFF(HOUR,a.Col2,x.Col2) AS Col2 
    FROM CTE a 
    CROSS APPLY (SELECT TOP 1 Col2 FROM CTE b WHERE Col1 = 'EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN' AND b.RN > a.RN ORDER BY Col2 ASC) x 
    WHERE Col1 = 'ENTRY_DOOR_CLOSE' 
0

希望這將有助於

--CREATE A TEMPORARY TABLE TO HOLD THE GIVEN DATA 
DECLARE @Table AS TABLE 
(
    ID INT IDENTITY(1,1) 
,Col1 VARCHAR(50) 
,Col2 DATETIMEOFFSET(0) 
) 

INSERT INTO @Table (COl1,Col2) VALUES ('ENTRY_DOOR_CLOSE', '2014-12-02'), 
             ('EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN' , '2014-12-03') 
             ,('ENTRY_DOOR_CLOSE','2014-12-04') 
             ,('EXIT_DOOR_CLOSE_ENTRY_DOOR_OPEN' , '2014-12-05') 

--Using common table expression do the following 
;WITH CTE AS 
(
    SELECT 

     ROW_NUMBER() OVER (ORDER BY ID) AS RowID 
     ,CONVERT(date,Col2) AS DateColumn 

    FROM @Table 

) 

SELECT 
'DIF' AS Col1 
,DATEDIFF(DD,SEcondCTE.DateColumn,FirstCTE.DateColumn) 
FROM 
CTE FirstCTE 
INNER JOIN 
CTE SEcondCTE 
ON 
FirstCTE.RowID = SEcondCTE.RowID + 1 
WHERE FirstCTE.RowID % 2 =0 
相關問題