繁体   English   中英

使用 Group By 按 SQL 中的状态折叠历史行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM