0
查找計數我有一個包含一個postgres數據庫:的重疊的時間
position
(其具有值1-10),starttime
,endtime
,並status
。狀態爲「開」或「關」。該數據庫列出機器位置「開」或「關」時的開始和停止時間,並且該機器具有10個「位置」。
我想找到最佳方法來計算所有10個職位同時關閉狀態的時間。
查找計數我有一個包含一個postgres數據庫:的重疊的時間
position
(其具有值1-10),starttime
,endtime
,並status
。狀態爲「開」或「關」。該數據庫列出機器位置「開」或「關」時的開始和停止時間,並且該機器具有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.
在給定的時間段內多少時間?還是從開始日期?平均每天? – maraca
在給定的時間框架內的時間可能是最好的,但給出一個基本的解決方案,我可以將其推斷給其他人。 –
查看[Packing Intervals](http://blogs.solidq.com/en/sqlserver/packing-intervals/)。它是爲SQL Server編寫的,但Postgres具有幾乎相同的功能。 –