0

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

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

我什至不确定您将如何称呼该过程,目前我已将源表分解为开始和停止日期以及服务名称的列表,并且正在遍历它们翻转标志并在开始更改时输出一行遇到日期或结束,但肯定必须有这种转换的模式或至少一个名称。

4

1 回答 1

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,具体取决于结束日期的解释方式。)

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

于 2013-04-04T17:39:15.197 回答