您要使用的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
函数来计算当前时间戳和先前时间戳之间的差异。
编辑:
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);
编辑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)
哪些DBMS您使用的? Oracle Postgres? – 2013-03-14 21:01:06
我正在使用MSSQL 2008 r2 – Mildfire 2013-03-14 21:07:31