将单个属性类型2表合并为切片快照

时间:2013-04-04 17:13:12

标签: sql plsql oracle10g data-warehouse

我有一个表格,其中的行指定了单个属性的开始日期和结束日期,例如:

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

我想将这些合并为单行,以指定每个时间段内哪些服务处于活动状态:

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

我甚至不确定你称之为进程,目前我已将源表分解为开始和停止日期和服务名称的列表,并且正在迭代它们翻转标志并在输出时输出一行遇到了开始日期或结束的变化,但肯定必须有一个模式或至少一个这种转换的名称。

1 个答案:

答案 0 :(得分: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,具体取决于结束日期的解释方式。)

外部查询执行累积总和。在任何给定日期,您都有活动服务。这些的结束日期是序列中的下一个日期。