Sql 查找重叠时间的计数

Sql 查找重叠时间的计数,sql,postgresql,Sql,Postgresql,我有一个postgres数据库,其中包含: 具有值1-10、开始时间、结束时间和状态的位置。状态为“开”或“关”。数据库列出机器位置打开或关闭时的启动和停止时间,该机器有10个位置 我试图找到最好的方法来计算在所有10个职位同时关闭的情况下累积的时间 我不认为这是最好的解决方案,但这是其中之一。其思想是只选择位置1,并与时间重叠且位置不是1的表本身连接。如果我们找到9个不同的位置值,那么我们会发现一个所有位置都关闭的情况 SELECT t.machine_id, COUNT(*) occ

我有一个postgres数据库,其中包含:

具有值1-10、开始时间、结束时间和状态的位置。状态为“开”或“关”。数据库列出机器位置打开或关闭时的启动和停止时间,该机器有10个位置


我试图找到最好的方法来计算在所有10个职位同时关闭的情况下累积的时间

我不认为这是最好的解决方案,但这是其中之一。其思想是只选择位置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。

在给定的时间范围内需要多少时间?还是从开始日期开始?平均每天?给定时间范围内的时间可能是最好的,但给定一个基本解决方案,我可能可以将其外推到其他解决方案中。看一看。它是为SQL Server编写的,但Postgres具有几乎相同的功能。