2013-03-14 105 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