2016-03-01 87 views
1

我有一個關係數據庫(postgres)和一個包含時間序列度量標準的表。每行包括 - obj_id, metric_id, timestamp, value有條件的時間序列數據彙總

我們假設我有3個代碼感興趣的代碼 - 1,4,5。我想過濾出所有的對象,對於相同的時間戳(讓我們假設所有度量標準的時間戳都是固定間隔的),具有度量標準1 < 10和(度量標準4 +度量標準5)< 10,事件發生了。

更具體的例子:

obj_id  metric_id   timestamp  value 
------------------------------------------------------ 
1    1    83827    9 
1    4    83827    2 
1    5    83827    1 
2    1    73261    11 
2    4    73261    2 
2    5    73261    5 
1    1    92381    24 
1    4    92381    10 
1    5    92381    100 
2    1    38239    7 
2    4    38239    3 
2    5    38239    4 

預期的結果將是:

obj_id  timestamp 
--------------------- 
    1   83827 
    2   38239 

我試圖建立一個高效的查詢做。這就是我腦子裏想的,爲了得到4 + 5的總和相同的時間戳,但我不知道什麼是對這些查詢粘合在一起的最好辦法:我不知道

SELECT obj_id, timestamp, sum(value) AS x 
FROM metric 
WHERE metric_id = 4 OR metric_id = 5 
group by obj_id, timestamp 

如何添加到此查詢度量標準1(我們應該單獨查詢),然後通過obj_idtimestamp篩選出結果。

我想過也許使用一個自加入,通過時間戳加入同一個表的兩個內部選擇。

回答

3

SQL Fiddle

booleaninteger收益率0或1鑄造

select obj_id, timestamp 
from metric 
where metric_id in (1,4,5) 
group by obj_id, timestamp 
having 
    sum(value * (metric_id in (4,5))::integer) < 10 
    and 
    sum(value * (metric_id = 1)::integer) < 10 
+0

絕對的輝煌和作品像一個魅力,我甚至可以閱讀它。謝謝! – Avi

0

這大概可以做的更好,但這種感覺整潔的理解(需要9.4+):

WITH x AS(
    SELECT 
    obj_id, 
    timestamp, 
    min(value) FILTER (WHERE metric_id = 1) as metric1, 
    min(value) FILTER (WHERE metric_id = 4) as metric4, 
    min(value) FILTER (WHERE metric_id = 5) as metric5 
    FROM metric 
    GROUP BY obj_id, timestamp 
) 
    SELECT obj_id, timestamp 
    FROM x 
    WHERE metric1 < 10 
    AND (metric4 + metric5) < 10 
+0

因元組失敗'(2,1,73261,1)' –

+0

這是因爲metric1> 10 ... I那是不是要求? –

+0

FWIW,查詢中的數據框將最後一列中的值指定爲11而不是1 –