首页 > 解决方案 > 从 SAS 面板数据中创建具有“结束日期”的列

问题描述

我有一个数据集,它是一个面板数据,在很多时刻都有很多 ID。它看起来像这样:

ID | Date       | Start date
1  | 01/01/2021 | 01/01/2021
1  | 02/01/2021 | 01/01/2021
1  | 03/01/2021 | 01/01/2021
1  | 20/01/2021 | 20/01/2021
1  | 21/01/2021 | 20/01/2021
2  | 05/01/2021 | 05/01/2021
2  | 06/01/2021 | 05/01/2021
2  | 07/01/2021 | 05/01/2021
3  | 10/01/2021 | 10/01/2021
3  | 11/01/2021 | 10/01/2021
3  | 25/01/2021 | 25/01/2021

基本上,Date表示 ID 出现在表格上的Start date日期,以及某些事情发生的开始日期(在这种情况下并不重要)。

我想获得这样的表:

ID | Start date | End date 
1  | 01/01/2021 | 03/01/2021
1  | 20/01/2021 | 21/01/2021
2  | 05/01/2021 | 07/01/2021
3  | 10/01/2021 | 11/01/2021
3  | 25/01/2021 | 25/01/2021

每个 ID 每个“开始日期”有一行,“结束日期”是根据该人拥有该“开始日期”的最后日期添加的。

这是我提出的代码,但它显然缺少一些东西,我认为主要是如何指定应该为每个 Start_date 完成“if”。另外,如果有更聪明的方法来做到这一点,那就proc sql太棒了。

DATA ArrearsPeriods;
    SET data;
    BY ID Start_date Date;
    RETAIN ID Start_date END_DATE;
    IF last.DateTHEN END_DATE = Date;
RUN;

我很感激你的帮助。

标签: sqlsasproc-sql

解决方案


找到了答案(在 proc sql 中,如果有人有 SAS 等价物,酷!)

proc SQL;
create table want as
SELECT a.ID
,      a.Start_date
,      a.Date
FROM Data a
WHERE Start_date IS NOT NULL
GROUP BY ID, Start_date
HAVING Date = max(Date);
QUIT;

推荐阅读