Teradata 查询根据条件计算开始和结束日期

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

我有某些 STS 代码的数据集,我需要保留开始日期和结束日期

Status =03

我有以下数据

HAVE

  ID               CHGDATE          STS
  101              11/21/2022        00
  101              11/22/2022        03
  101              11/23/2022        03
  101              11/24/2022        03
  101              03/08/2023        04
  102              08/05/2022        03
  102              08/08/2022        04
  102              11/10/2022        03
  102              11/17/2022        00

WANT
   ID            STARTDATE           ENDDATE
  101           11/22/2022           03/08/2023
  102           08/05/2022           08/08/2022
  102           11/10/2022           11/17/2022

 
  • ID 101 在 2022 年 11 月 22 日首次获得

    STS=03
    ,因此这应该是我对这张唱片的“
    StartDate
    ”。该记录于 2023 年 3 月 8 日将其
    STS
    更改为
    03
    之外的其他内容,因此应该是
    EndDate

  • ID 102 有多次

    STS=03
    ,其中两个
    Start
    End
    日期为 8/5-8/8 和 11/10-11/17

     My query
    
      SELECT 
       ID,STS,CHGDATE AS STARTDATE,
       LEAD(CHGDATE) OVER (PARTITION BY ID ORDER BY CHGDATE) AS ENDDATE
    FROM 
      HAVE
      WHERE STS=03
    

此查询适用于 ID 102,但不适用于 ID 101。是否有其他方法可以实现所需的结果?

谢谢

sql teradata lag teradata-sql-assistant lead
1个回答
0
投票

它不会按照您尝试的方式工作。您的查询排除了 sts <> '03' 的所有行。我会将其分成 2 个派生表,一个用于您的开始日期 (sts = 03),另一个用于其他所有内容 (sts <> '03')。然后您可以将它们连接在一起,并使用限定来仅获取相关行:

create volatile table vt_foo
(
id int,
changedate date,
sts varchar(2))
on commit preserve rows;
insert into vt_foo values (102, '2022-08-05','03');
insert into vt_foo values (102, '2022-08-08','04');
insert into vt_foo values (102, '2022-11-10','03');
insert into vt_foo values (102, '2022-11-17','00');

select
strt.id,
strt.changedate as startdate,
oth.changedate as enddate
from 
(
select
*
from
vt_foo
where
sts = '03')  strt
left join
(
select
*
from
vt_foo
where
sts <>  '03') oth
    on strt.id = oth.id
    and oth.changedate > strt.changedate
qualify row_number() over (partition by strt.id,strt.changedate order by oth.changedate) = 1
© www.soinside.com 2019 - 2024. All rights reserved.