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