我尝试创建一个代码片段来使用依赖于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函数?
问候
帕特里克
答案 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;
未经测试,可能存在一些错误,但您会明白这一点。