如何找到总体条件存在的地方

时间:2016-07-20 20:13:24

标签: sql tsql

我正在尝试创建一个报告,显示自动喷水灭火系统运行了多长时间。该系统由几个喷洒器组成,每个喷洒器仅跟踪其自身,然后将该信息发送到数据库。我的问题是每个洒水喷头都有自己的运行时间(IE如果5个洒水喷头全部同时运行10分钟,它会报告总运行时间为50分钟),我想知道只有净运行量时间 - 在这个例子中,它将是10分钟。

数据库由一个时间戳和一个布尔值组成,每次关闭或关闭洒水喷头时它都会记录时间戳(其开/关状态由布尔值的1/0表示)。

因此,要计算出系统每天的总净时间 - 无论是1喷水运行还是全部 - 我需要检查数据库中没有任何洒水装置的时间范围(或任何地方)洒水车根本打开了)。我认为查询的开头看起来像

SELECT * FROM MyTable
WHERE MyBoolean = 0
AND [ ... ]

但我不确定AND之后的条件语句是什么样的,可以检查时间戳。

我是否可以向数据库发送一个查询报告这种格式的信息?

编辑:

这是数据记录到的表 - 它实际上只是一个名称,一个布尔值,以及布尔值更改时的日期时间,这是整个数据库 enter image description here

2 个答案:

答案 0 :(得分:0)

每次喷水器打开时,正在运行的洒水喷头的数量增加1,每次关闭时,数量减少1.如果您转换数据,则得到这个:

timestamp   on/off
07:00:05    1
07:03:10    1
07:05:45    -1

然后你按顺序排列一系列事件;他们所指的喷头是无关紧要的。 (我已经将零改为-1,原因是片刻会变得明显。你可以用"(2 *值) - 1")

现在把一个跑步总数放在一起:

select a.timestamp, (SELECT SUM(a.on_off)
                   FROM sprinkler_events b
                   WHERE b.timestamp <= a.timestamp) as run_total
  from sprinkler_events a
 order by a.timestamp;

其中sprinkler_events是我上面列出的转换数据。这会给你:

timestamp    run_total
07:00:05     1
07:03:10     2
07:05:45     1

等等。其中每行总共为零的行是关闭所有洒水器的时间,我认为这是您正在寻找的。如果您需要总结他们开启或关闭的时间,您需要进行额外的处理:搜索&#34;连续行之间的日期差异&#34;而且你会看到解决方案。

答案 1 :(得分:0)

您可以考虑查看当前所有洒水喷头是否已关闭。例如:

SELECT COUNT (DISTINCT s._NAME) AS sprinkers_currently_off
FROM (
    SELECT 
        _NAME,
        _VALUE,
        _TIMESTAMP,
        ROW_NUMBER() OVER (PARTITION BY _NAME ORDER BY _TIMESTAMP DESC, _VALUE) AS latest_rec
    FROM sprinklers
    ) s
WHERE 
    _VALUE = 0
    AND latest_rec = 1

内部查询对记录进行排序,以便您可以获取所有喷头的最新状态,外部查询计算当前关闭的数量。如果您有10个喷头,当此查询返回10时,您将全部报告。

如果您想查看过去,可以通过将日期范围应用于内部查询来修改此问题,但这样可以让您走上正确的轨道。