sql - 从 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;
我很感激你的帮助。
解决方案
找到了答案(在 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;
推荐阅读
- android - 为什么 ViewModel 中的协程方法离开 Fragment 后还在继续处理?
- asp.net-core - 全局异常hadling .net核心不起作用
- angular - 如何从传单地理编码器在谷歌地图中添加标记
- python-3.x - 手动实现近似函数
- javascript - 空手道模糊匹配 - 构建自定义标记
- javascript - 使用像 eval 这样的字符串模板
- node.js - Nodejs 和 mssql 日期时间输入参数
- java - H2 数据库 - 从 sql 文件创建表
- python - 按值获取python字典中的项目位置
- python - 使用 dask 并行创建树