SQL PostgreSQL - 比较顺序行以确定更改和从/到日期

问题描述 投票:0回答:1

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
sql postgresql
1个回答
0
投票

首先,你想要使用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;
© www.soinside.com 2019 - 2024. All rights reserved.