如何找出每个阶段的第一次出现
How to find out first occurrence of each phase
我正在处理客户数据,客户阶段可以根据不同的因素发生变化。我需要找出每一个阶段,以及它变成那个阶段的时间。
示例数据:
预期结果:
我尝试使用滞后功能,但它在重复。
谢谢
lag
可以在这里提供帮助,但您需要添加一些过滤并处理延迟结果中的 null
with ordered_data as (
select *
, lag(phase) over (order by phase_date desc) prev_phase
, lag(phase_date) over (order by phase_date desc) prev_phase_date
from monitoring.st1
)
select *
from ordered_data
where phase != prev_phase
union
(
select *
, phase as prev_phase
, phase_date as prev_phase_date
from monitoring.st1
order by phase_date
limit 1
)
order by phase_date desc
它生成以下结果,其中 prev_phase 和 prev_phase_date 保存您要的结果寻找
customerid
phase
phase_date
prev_phase
prev_phase_date
A
Hold
2021-07-08
Active
2021-08-08
A
Suspended
2020-11-10
Hold
2021-01-01
A
Active
2020-10-01
Suspended
2020-11-10
A
Hold
2020-08-08
Active
2020-10-01
A
Active
2020-03-06
Hold
2020-05-05
A
Active
2020-01-01
Active
2020-01-01
我正在处理客户数据,客户阶段可以根据不同的因素发生变化。我需要找出每一个阶段,以及它变成那个阶段的时间。
示例数据:
预期结果:
我尝试使用滞后功能,但它在重复。
谢谢
lag
可以在这里提供帮助,但您需要添加一些过滤并处理延迟结果中的 null
with ordered_data as (
select *
, lag(phase) over (order by phase_date desc) prev_phase
, lag(phase_date) over (order by phase_date desc) prev_phase_date
from monitoring.st1
)
select *
from ordered_data
where phase != prev_phase
union
(
select *
, phase as prev_phase
, phase_date as prev_phase_date
from monitoring.st1
order by phase_date
limit 1
)
order by phase_date desc
它生成以下结果,其中 prev_phase 和 prev_phase_date 保存您要的结果寻找
customerid | phase | phase_date | prev_phase | prev_phase_date |
---|---|---|---|---|
A | Hold | 2021-07-08 | Active | 2021-08-08 |
A | Suspended | 2020-11-10 | Hold | 2021-01-01 |
A | Active | 2020-10-01 | Suspended | 2020-11-10 |
A | Hold | 2020-08-08 | Active | 2020-10-01 |
A | Active | 2020-03-06 | Hold | 2020-05-05 |
A | Active | 2020-01-01 | Active | 2020-01-01 |