2017-08-17 111 views
1

我有數據象下面這樣:如何總結postgresql中重疊數據的數據?

t_id s_id date_1  date_2  T_count   expected Result 
N1 1-1I 2012-12-11 2013-01-22 0.21327014218009478622 4.7 
N2 1-1I 2011-08-03 2011-11-10 3.8461538461538462  4.7 
N3 1-1I 2013-12-05 2013-12-20 1.6935483870967742  4.7 
N4 1-1I 2014-12-08 2015-06-25 4.7727272727272727  4.7 
N5 1-1I 2017-03-08 (null)  (null)     4.7 
N6 1-I6 2013-04-11 2013-10-03 0.61538461538461538462 0.97 
N7 1-I6 2011-09-27 2013-06-20 0.37325038880248833651 0.97 

,我想計算t_count值的總和,如果日期1和date2相同S_ID的針對不同T_ID其他爲同一S_ID返回最大值相同S_ID重疊。

現在我正在使用的postgres代碼正在執行值的總和,不管重疊,請你可以建議。

有些情況下,某些數據可能會重疊,有些情況下不會出現給定的s_id,因此多年來它會重疊,我們需要一些數據並找出所有情況的最大值,如個體,重疊和給一個最大的答案。

select t1.s_id,sum(t1.t_count) 
       from abc t1 
       JOIN abc t2 
       ON daterange(t1.date_1, t1.date_2, '[]') 
          && daterange(t1.date_1, t1.date_2, '[]') 
             and t1.s_id = t2.s_id 
       GROUP BY t1.s_id 
+0

你應該只參加在S_ID,並檢查是否在'案重疊when' - 但我不明白爲什麼你建立日期範圍只T1日期 - 什麼?應該帶些什麼..或者它只是一個錯字重疊? –

+0

如果某個's_id'的某些時間間隔重疊,結果應該是什麼?例如,如果您將'N3'的'date_1'更改爲'2013-01-05',結果如何? –

+0

看看這個答案https://dba.stackexchange.com/questions/89864/maximum-sum-of-overlapping-ranges – raphael

回答

0

我在做與自身比較的錯誤,我修改後的代碼一點得到這個結果。

with cte as 
(

    select t1.s_id,sum(t1.t_count) as scount 
        from abc t1 
        JOIN abc t2 
        ON daterange(t1.date_1, t1.date_2, '[]') 
           && daterange(t1.date_1, t1.date_2, '[]') 
              and t1.s_id = t2.s_id 
        and t1.s_id ! = t2.s_id 
        GROUP BY t1.s_id 
) 
select 
     s_id,greatest(scount,max(t_count) over (partition by s_id)) as finalvalue 
from abc 
left outer join cte 
on abc.s_id = cte.s_id 
1

目前尚不清楚,如果一些有一定s_id重疊區間,有些沒有邏輯應該如何工作。

如果您知道在您的數據中,所有區間重疊或者沒有重疊,那麼很容易確定它。

計算每個間隔的持續時間並總結所有這些持續時間。將它與從第一個到最後一個日期的時間進行比較。

我認爲在date_2意味着一些非常大的日期在未來。

WITH 
CTE 
AS 
(
    SELECT 
     s_id 
     ,SUM(COALESCE(date_2, '9999-12-31') - date_1) AS TotalDuration 
     ,MIN(date_1) AS FirstDate 
     ,MAX(COALESCE(date_2, '9999-12-31')) AS LastDate 
     ,SUM(T_count) AS SumCount 
     ,MAX(T_count) AS MaxCount 
    FROM YourTable 
    GROUP BY s_id 
) 
SELECT 
    s_id 
    ,CASE WHEN TotalDuration > (LastDate - FirstDate) 
    THEN -- intervals overlap 
     SumCount 
    ELSE -- none of the intervals overlap 
     MaxCount 
    END AS Result 
FROM CTE 
;