PostgreSQL - 完全难以理解这一点 - 我有一个存储交易的表,需要创建一个显示一个人何时改变公司的视图。所以我需要不断地比较记录(试图用OVER和PARTITION BY来做这个),但是还需要只在公司改变时总结为记录,而且还要根据数据集填充到日期/从日期填充。
输入示例:
Person_ID Company_Name Date
1 AAA 1/1/2019
1 BBB 1/10/2019
1 CCC 1/21/2019
1 AAA 2/1/2019
2 DDD 1/1/2019
2 DDD 1/15/2019
2 EEE 1/25/2019
期望的SQL输出:
Person_ID Company_Name From_Date To_Date
1 AAA 1/1/2019 1/9/2019
1 BBB 1/10/2019 1/20/2019
1 CCC 1/21/2019 1/31/2019
1 AAA 2/1/2019 12/31/9999
2 DDD 1/1/2019 1/24/2019
2 EEE 1/25/2019 12/31/9999
首先,你想要使用lag()
摆脱你不想要的行。然后使用lead()
获取日期:
select t.*,
lead(date, 1, '9999-12-31'::date) over (partition by person_id order by date) as to_date
from (select t.*,
lag(company_name) over (partition by person_id order by date) as prev_company_name
from t
) t
where prev_company_name is distinct from company_name;
编辑:
对于评论中的问题:
select t.*,
lead(date, 1, '9999-12-31'::date) over (partition by person_id order by date) as to_date
from (select t.*,
lag(company_name) over (partition by person_id order by date) as prev_company_name,
min(company_name) over (partition by person_id) as min_company_name,
max(company_name) over (partition by person_id) as max_company_name
from t
) t
where prev_company_name is distinct from company_name and
min_company_name <> max_company_name;