2016-03-29 38 views
0

查找計數我有一個包含一個postgres數據庫:的重疊的時間

position(其具有值1-10),starttimeendtime,並status。狀態爲「開」或「關」。該數據庫列出機器位置「開」或「關」時的開始和停止時間,並且該機器具有10個「位置」。

我想找到最佳方法來計算所有10個職位同時關閉狀態的時間。

+0

在給定的時間段內多少時間?還是從開始日期?平均每天? – maraca

+0

在給定的時間框架內的時間可能是最好的,但給出一個基本的解決方案,我可以將其推斷給其他人。 –

+0

查看[Packing Intervals](http://blogs.solidq.com/en/sqlserver/packing-intervals/)。它是爲SQL Server編寫的,但Postgres具有幾乎相同的功能。 –

回答

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.