2013-03-14 109 views
1

我有一個查詢,顯示這樣的表中的信息。sql運行時報告

SELECT tag.label, inputs.input_raw, inputs.unix_timestamp, tag.inverted FROM inputs 
JOIN tag 
ON tag.tag_id = inputs.tag_id 
WHERE (inputs.tag_id = 92084) 

AND (inputs.date_time > dateadd(day,-1,getdate())) 
ORDER BY date_time DESC 

enter image description here

我想編寫一個查詢這將做兩件事情。

我需要每次input_raw從'0'切換到'1'的計數。

我還需要運行泵的總時間,使用unix_timestamp ie。當input_raw = 1時。

有沒有人有任何想法。

我會解決一個算法,使用PHP來獲得我需要的結果,但我已經撞到了一堵磚牆,一直沒能弄清楚。

感謝

編輯:該表還包含了UNIX_TIMESTAMP的值相匹配的date_time的領域,如果有,可以使用DATE_TIME法>

+0

哪些DBMS您使用的? Oracle Postgres? – 2013-03-14 21:01:06

+0

我正在使用MSSQL 2008 r2 – Mildfire 2013-03-14 21:07:31

回答

3

您要使用的LeadLag功能將當前結果與前一個或下一個進行比較。這些功能,但是,在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) 
+0

太棒了。努力告訴我一些週期。當你說,「你可以使用相同的Lag函數來計算當前時間戳和以前的時間戳之間的差異。」,它將所有的時間差加在一起,所以我得到一個盛大的「總時間泵打開」?還有一件事。有沒有辦法讓sql使用倒置字段作爲條件。例如,如果反轉爲0,則使用0到1的條件,但如果反轉爲1,則使用1到0?再次感謝 – Mildfire 2013-03-14 21:41:52

+0

或者我猜想一個更好的方法來把它。如果倒置爲「1」,則將input_raw中的「0」視爲「1」,如果倒置爲「0」,則保持它獨立? – Mildfire 2013-03-14 21:51:02

+0

請參閱我答案中的編輯。 – JodyT 2013-03-14 21:54:45