[英]Find second customer visit based on custom conditions in sql
我在 postgre sql 中有一个客户访问表,其中包含以下字段customer_id
、 visit_date
、 purchase_amount
。 对于每个独特的客户,我想找到他们的第一次和第二次访问。
我发现他们的第一次治疗是
min(d.visit_date) OVER (PARTITION BY d.customer_id) as index_visit_date
我无法弄清楚如何找到第二次治疗,因为我想将第二次访问定义为 index_visit_date 至少 60 天后的访问。
因此,如果客户有以下访问历史:
id|visit_date|purchase_amount
1 | 10-19-19 |1000
1 | 10-24-19 |100
1 | 12-15-19 |1000
index_visit_date = 10-19-19 和 second_treatment = 12-15-19
我不确定如何计算从 index_visit_date 到 select 作为第二次治疗后至少 60 天的下一次访问的时间差。
一种方法是横向连接:
select vfirst.*, vnext.*
from (select distinct on (id) v.*
from visits v
order by id, visit_date
) vfirst left join lateral
(select vnext.*
from visits vnext
where vnext.id = vfirst.id and
vnext.visit_date >= vfirst.visit_date + interval '60 day'
order by vnext.visit_date
limit 1
) vnext
on true;
实际上,如果您只想要日期,还有更简单的方法,例如:
select v.*
from (select v.*,
row_number() over (partition by id order by visit_date) as seqnum,
min(visit_date) over (partition by id
order by visit_date
range between '60 day' following and unbounded following
) as next_visit_date
from visits v
) v
where seqnum = 1
这是一个 db<>fiddle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.