使用Group by在SQL中按状态折叠历史行



我尝试创建一个代码片段来使用上下文相关的group-by-clause。

所以我拥有的是表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

是否存在某种分析sql函数,只要状态(按Date_FROM排序)不变,就可以执行聚合?

问候

Patrick

需要一些步骤和两个分析函数。从内部步骤运行到外部步骤,以了解发生了什么:

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;

未经测试,可能会有一些错误,但你会明白的。

最新更新