Вы хотите использовать функцию Lead
или Lag
к сравните текущий результат с предыдущим или последующим. Эти функции, однако, введены в SQL Server 2012.
С помощью Mr. pinaldave мне удалось произвести следующий SQL Fiddle, который подсчитывает каждое изменение от 0 до 1.
;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
чтобы вычислить разницу между текущей меткой времени и предыдущей меткой времени.
EDIT:.
This 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);
EDIT 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)
Какие СУБД вы используете? Oracle Postgres? –
Я использую MSSQL 2008 r2 – Mildfire