Рассчитать разницу (время) между двумя записями, сохранить последнюю запись в результате - PullRequest
1 голос
/ 05 ноября 2011

У меня есть таблица с данными процесса, содержащими 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 Ответ

1 голос
/ 05 ноября 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...