Lead
or関数を使用してLag
、現在の結果を前または次の結果と比較します。ただし、これらの関数は SQL Server 2012 で導入されました。
pinaldave 氏の助けを借りて、0 から 1 までのすべての変更をカウントする次のSQL Fiddleを作成することができました。
;WITH x AS
(
SELECT
1 AS ldOffset, -- equiv to 2nd param of LEAD
1 AS lgOffset, -- equiv to 2nd param of LAG
NULL AS ldDefVal, -- equiv to 3rd param of LEAD
NULL AS lgDefVal, -- equiv to 3rd param of LAG
ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row,
label,
input_raw,
unix_timestamp,
inverted
FROM inputs
)
SELECT
COUNT(1)
FROM x
LEFT OUTER JOIN x AS xLg
ON x.row = xLg.row + x.lgOffset
WHERE xLg.input_raw = 0 AND x.input_raw = 1;
同じ関数を使用してLag
、現在のタイムスタンプと前のタイムスタンプの差を計算できます。
編集:
この SQL Fiddleは、ポンプが実行されている合計時間を取得する方法を示す必要があります (running
自分で定義する必要があります。このクエリは、0 から 1 に移動するか、1 のままでいることが実行されていることを前提としています。また、タイムスタンプの計算を再確認する必要があります。 'これまで unix タイムスタンプを使用したことがありません。
;WITH x AS
(
SELECT
1 AS ldOffset, -- equiv to 2nd param of LEAD
1 AS lgOffset, -- equiv to 2nd param of LAG
NULL AS ldDefVal, -- equiv to 3rd param of LEAD
NULL AS lgDefVal, -- equiv to 3rd param of LAG
ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row,
label,
input_raw,
unix_timestamp,
inverted
FROM inputs
)
SELECT
SUM(DATEDIFF(mi,
DATEADD(ss, xLg.unix_timestamp,'01/01/1970'),
DATEADD(ss, x.unix_timestamp,'01/01/1970')))
FROM x
LEFT OUTER JOIN x AS xLg
ON x.row = xLg.row + x.lgOffset
WHERE
(xLg.input_raw = 0 AND x.input_raw = 1)
OR
(xLg.input_raw = 1 AND x.input_raw = 1);
編集2:
反転を確認する最も簡単な方法は、WHERE
句を次のように変更することだと思います。
WHERE
(x.inverted = 1 AND xLg.input_raw = 0 AND x.input_raw = 1)
OR
(x.inverted = 0 AND xLg.input_raw = 1 AND x.input_raw = 0)