使用“分组依据”按SQL在状态中折叠历史行

时间:2015-11-27 14:24:06

标签: sql oracle

我尝试创建一个代码片段来使用依赖于group by子句的上下文。

所以我拥有的就像是 表1

Customer Status Date_FROM Date_TO
A        1      1.11.15   2.11.1
A        1      2.11.15   3.11.15
...      ...    ...       ...
A        2      5.11.15   6.11.15
...      ...    ...       ...
A        1      15.11.15  20.11.15
A        2      20.11.15  27.11.15

因此,我的客户状态发生了变化,大部分时间都处于日常状态行。所以在一个简单的场景中(只有2个间隔)我可以使用如下代码:

    select Customer, Status, min(Date_FROM), max(Date_TO)
    from Table1 
    group by Customer, Status

但在更复杂的情况下我想要的是

表2

Customer Status Date_FROM Date_TO
A        1      1.11.15   5.11.15
A        2      5.11.15   15.11.15
A        1      15.11.15  20.11.15
A        2      20.11.15  27.11.15

只要状态(由Date_FROM排序)没有变化,是否存在执行聚合的某种分析sql函数?

问候

帕特里克

1 个答案:

答案 0 :(得分:1)

将采取一些步骤来完成它和两个分析功能。从内部步骤运行到外部以了解发生的情况:

with a as(    
   select Customer, Status, Date_FROM, Date_TO,
       case when status <> lag(status) over (partition by customer order by date_from) 
       then 1 
       else 0 
       end status_switch
   from table),
b as(
select 
   Customer, 
   Status, 
   Date_FROM, 
   Date_TO, 
   sum(status_switch) over (partition by customer order by status_switch) as new_status_seq 
from a
)
select customer, status, min(date_from), max(date_to)
from b
group by customer, status, new_status_seq;

未经测试,可能存在一些错误,但您会明白这一点。