2011-11-04 65 views
1

我有一個包含TagName,TimeStamp和機器狀態的過程數據的表,1 =正在運行,0 =未運行。原始數據可以是這個樣子:計算兩條記錄之間的差異(時間),將最後一條記錄保留在結果中

Bss105_AUTO 2011-11-03 17:00:00.0000000 1 
Bss105_AUTO 2011-11-03 22:32:49.5520000 1 
Bss105_AUTO 2011-11-03 22:36:52.3200000 1 
Bss105_AUTO 2011-11-04 08:15:28.6460000 0 
Bss105_AUTO 2011-11-04 08:17:42.6520000 1 
Bss105_AUTO 2011-11-04 11:49:42.3780000 1 

我想要實現的是通過使用此查詢來計算機總運行時間:

WITH rows AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY DateTime) AS RowNumber 
     FROM History where TagName='Bss105_AUTO' 
       AND DateTime >= '2011-11-03 17:00:00.000' 
       AND DateTime <= '2011-11-04 17:00:00.000' 
       AND wwRetrievalMode = 'Delta' 
       AND wwVersion = 'Original' 
       AND OPCQuality = 192 
     ) 
    SELECT mc.RowNumber, mc.DateTime, mc.TagName, mc.Value as MachineStatus, DATEDIFF(second, mc.DateTime, mp.DateTime) GrindingMachineRuntimeInSeconds 
    FROM rows mc 
    JOIN rows mp 
    ON  mc.RowNumber = mp.RowNumber - 1 
    where mc.Value <> 0 

我不想包括計算機器未運行的停機時間(狀態0 =未運行)。沒問題,我可以通過從結果中排除這些記錄來排除這些記錄(最後一列包含記錄之間的秒數)。

1 2011-11-03 17:00:00.0000000 Bss105_AUTO 1 19969 
2 2011-11-03 22:32:49.5520000 Bss105_AUTO 1 243 
3 2011-11-03 22:36:52.3200000 Bss105_AUTO 1 34716 
5 2011-11-04 08:17:42.6520000 Bss105_AUTO 1 12720 

我在這裏的問題是,我也需要存儲與此時間戳的最後一條記錄:2011-11-04 11:49:42.3780000

這是隻有在這一點上,機器的狀態等於1(=運行)的情況下,因爲我需要知道它是否正在運行或者不能計算從最後存儲的記錄到查詢間隔結束的運行時間!那條記錄的最後一列必須是空的!

有沒有哪位高手可以幫我一下呢?

親切的問候!

回答

1
CREATE TABLE [dbo].[History] 
(
    [TagName]   CHAR(11) NOT NULL, 
    [DateTime]   DATETIME2 NOT NULL, 
    [MachineStatus]  BIT   NOT NULL 
) 
GO 

INSERT [dbo].[History] 
VALUES ('Bss105_AUTO', '2011-11-03 17:00:00.0000000', 1), 
     ('Bss105_AUTO', '2011-11-03 22:32:49.5520000', 1), 
     ('Bss105_AUTO', '2011-11-03 22:36:52.3200000', 1), 
     ('Bss105_AUTO', '2011-11-04 08:15:28.6460000', 0), 
     ('Bss105_AUTO', '2011-11-04 08:17:42.6520000', 1), 
     ('Bss105_AUTO', '2011-11-04 11:49:42.3780000', 1) 
GO 

;WITH [cteRows] AS 
(
    SELECT [TagName], 
      [DateTime], 
      [MachineStatus], 
      ROW_NUMBER() OVER (ORDER BY [DateTime]) AS [RowNumber] 
    FROM [dbo].[History] 
    WHERE [TagName] = 'Bss105_AUTO' 
    AND [DateTime] >= '2011-11-03 17:00:00.000' 
    AND [DateTime] <= '2011-11-04 17:00:00.000' 
) 
SELECT mc.[RowNumber], 
     mc.[DateTime], 
     mc.[TagName], 
     mc.[MachineStatus], 
     DATEDIFF(SECOND, mc.[DateTime], ISNULL(mp.[DateTime], mc.[DateTime])) AS [GrindingMachineRuntimeInSeconds] 
FROM [cteRows] mc 
LEFT JOIN [cteRows] mp 
    ON mc.[RowNumber] = mp.[RowNumber] - 1 
WHERE mc.[MachineStatus] <> 0 
+0

謝謝!這解決了我的問題。 :) – sekarmaeu

相關問題