查找重叠次数

时间:2016-03-29 19:31:42

标签: sql postgresql

我有一个包含以下内容的postgres数据库:

position(值为1-10),starttimeendtimestatus。状态为“开”或“关”。数据库列出了机器位置“开”或“关”的开始和停止时间,并且该机器有10个“位置”。

我正在努力寻找最佳方法来计算所有10个位置同时关闭状态的累计时间。

1 个答案:

答案 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。