[英]Collapse historical rows by status in SQL using Group By
我尝试创建一个代码片段来使用上下文依赖 group by 子句。
所以我所拥有的是类似于 Table1
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 函数可以执行聚合?
你好
帕特里克
将采取一些步骤来做到这一点和两个分析功能。 从内部步骤到外部运行它以了解会发生什么:
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;
没有经过测试,可能会有一些错误,但你会明白的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.