您要使用的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