我有一个包含以下内容的postgres数据库:
position
(值为1-10),starttime
,endtime
和status
。状态为“开”或“关”。数据库列出了机器位置“开”或“关”的开始和停止时间,并且该机器有10个“位置”。
我正在努力寻找最佳方法来计算所有10个位置同时关闭状态的累计时间。
答案 0 :(得分:0)
我并不认为这是最好的解决方案,但它是其中之一。我们的想法是只选择位置1并与表格本身连接,其中时间重叠且位置不是1.如果我们找到9个不同的位置值,那么我们发现所有位置都关闭的一个出现。
SELECT
t.machine_id,
COUNT(*) occurances
FROM (
SELECT
t1.machine_id,
t1.starttime,
COUNT(DISTINCT t2.position) c
FROM
yourTable t1 INNER JOIN
yourTable t2 ON
t2.machine_id = t1.machine_id AND
t2.status = 'off' AND
t2.position <> 1 AND
(t2.starttime BETWEEN t1.starttime AND t1.endtime OR -- those 3 lines check if the
t2.endtime BETWEEN t1.starttime AND t1.endtime OR -- times are overlapping
(t2.starttime < t1.starttime AND t2.endtime > t1.endtime))
WHERE
t1.status = 'off' AND
t1.position = 1
GROUP BY
t1.machine_id,
t1.starttime
) t
WHERE
t.c = 9
GROUP BY
t.machine_id
;
结果可能会因您为t1
选择的位置而有所不同。因为如果一个位置非常短而另一个位置很长时间,那么您可能会多次计算相同的重叠(也取决于其他位置时间)。因此,选择花费时间最长的位置而不仅仅是1。