2013-04-04 58 views
0

我有行指定單個屬性的開始和結束日期,如表:合併單個屬性類型2表分成切片快照

FK START_DATE  END_DATE  ServiceA  ServiceB  ServiceC 
1 01-Jan-00  18-Feb-05  N    Y    Y 
1 19-Feb-05  28-May-08  Y    Y    Y 
1 28-May-08      N    Y    Y 

我想這些合併到單個行的是specifiy該服務是活躍在每一個時間段:

FK START_DATE END_DATE  ServiceA ServiceB ServiceC 
1 01-Jan-00 18-Feb-05  N   Y   Y 
1 19-Feb-05 27-May-08  Y   Y   Y 
1 28-May-08     N   Y   Y 

我什至不知道你叫什麼過程,目前我已經在源表分解成開始的名單和停止日期和服務名稱,並通過它們迭代翻轉標誌並在更改時輸出一行在遇到開始日期或結束時,但肯定必須有一種模式或至少一個名稱用於這種轉換。

+0

我認爲在您的演示數據中準確記錄日期會有所幫助。現在有點模棱兩可。 – 2013-04-04 17:25:46

回答

1

這是解析函數的應用程序:

select fk, dte as fromdte, 
     lead(dte) over (partition by fk order by dte) as todte, 
     sum(A) over (partition by fk order by dte) as A, 
     sum(B) over (patition by fk order by dte) as B, 
     sum(C) over (partition by fk order by dte) as C 
from ((select fk, fromd as dte, 
       (case when service = 'A' then 1 else 0 end) as A, 
       (case when service = 'B' then 1 else 0 end) as B, 
       (case when service = 'C' then 1 else 0 end) as C 
     from services 
    ) union all 
     (select fk, tod, 
       (case when service = 'A' then -1 else 0 end) as A, 
       (case when service = 'B' then -1 else 0 end) as B, 
       (case when service = 'C' then -1 else 0 end) as C 
     from services 
    ) 
    ) t 

(查詢可能有語法錯誤 - 沒有測試)。

union all被賦予每個服務的「計數器」值在給定的日期。 (注意,「結束日期」可能會關閉1,具體取決於結束日期的解釋方式。)

外部查詢執行累計和。在任何給定的日期,你都有活躍的服務。這些結束日期是序列中的下一個日期。

+0

看起來很有希望,我會放棄並回復你。 – Baxter 2013-04-04 17:44:07

+0

似乎非常接近,當兩個服務在同一天開始時,它返回兩行,一個長度爲零,一個長度正確。 – Baxter 2013-04-04 18:01:24

+0

只需要一個外部查詢來篩選具有相同開始日期和結束日期的行,並且如您所說的通過一個修復程序結束日期關閉似乎完全匹配我的測試數據,那麼主要功能對我來說是新的,非常酷,謝謝您。 – Baxter 2013-04-04 18:15:10