我有某些 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。是否有其他方法可以实现所需的结果?
谢谢
它不会按照您尝试的方式工作。您的查询排除了 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