2013-04-04 62 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