我正在尝试创建一个报告,显示自动喷水灭火系统运行了多长时间。该系统由几个喷洒器组成,每个喷洒器仅跟踪其自身,然后将该信息发送到数据库。我的问题是每个洒水喷头都有自己的运行时间(IE如果5个洒水喷头全部同时运行10分钟,它会报告总运行时间为50分钟),我想知道只有净运行量时间 - 在这个例子中,它将是10分钟。
数据库由一个时间戳和一个布尔值组成,每次关闭或关闭洒水喷头时它都会记录时间戳(其开/关状态由布尔值的1/0表示)。
因此,要计算出系统每天的总净时间 - 无论是1喷水运行还是全部 - 我需要检查数据库中没有任何洒水装置的时间范围(或任何地方)洒水车根本打开了)。我认为查询的开头看起来像
SELECT * FROM MyTable
WHERE MyBoolean = 0
AND [ ... ]
但我不确定AND之后的条件语句是什么样的,可以检查时间戳。
我是否可以向数据库发送一个查询报告这种格式的信息?
编辑:
答案 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时,您将全部报告。
如果您想查看过去,可以通过将日期范围应用于内部查询来修改此问题,但这样可以让您走上正确的轨道。