1

我有一个查询,它显示来自这样的表的信息。

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

在此处输入图像描述

我想写一个查询,它会做两件事。

我需要计算每次 input_raw 从“0”切换到“1”的次数。

我还需要泵运行的总时间,使用 unix_timestamp 即。当 input_raw = 1 时。

有没有人有任何想法。

我会选择一种算法来使用 php 来获得我需要的结果,但我已经碰壁了,无法弄清楚。

谢谢

编辑:该表还包含一个 date_time 字段,如果有可以使用的 date_time 方法,则该字段与 unix_timestamp 的值匹配>

4

1 回答 1

3

您想使用LeadorLag函数将当前结果与上一个或下一个结果进行比较。但是,这些函数是在 SQL Server 2012 中引入的。

在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函数来计算当前时间戳和前一个时间戳之间的差异。

编辑:

这个 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)
于 2013-03-14T21:27:39.250 回答