*SQL,获取 ID 的历史状态

sas系统的表tb存储病人的医疗历史记录,当Visit_code=Surgery时表示手术,Visit_code=Office表示咨询,每个病人有多条Visit_code,有时只有Surgery或只有Office:

Id

Visit_Date

Visit_code

A30

5/15/2004

Surgery

A30

2/5/2005

Office

B01

12/7/2002

Office

B01

11/21/2002

Surgery

C01

12/1/2001

Office

C01

11/1/2001

Office

C01

5/15/2001

Surgery

C01

4/15/2001

Surgery

C02

12/1/2001

Surgery

C03

12/1/2001

Office


要求计算出每个病人的历史状态,如果有过咨询,则 Office_Visit=1,否则为 0;如果手术后 6 个月内进行过咨询,则 SX_past_6mo=1,否则为 0:

Id

Office_Visit

SX_past_6mo

A30

1

0

B01

1

1

C01

1

1

C02

0

0

C03

1

0

编写SPL代码:


A

1

=sas1.query("select * from tb order by Id,Visit_Date")

2

=A1.group(Id)
.new(Id,(S=0,~.max( if( Visit_code=="Office", if( S==0 && Visit_code[-1]=="Surgery" && interval@m(Visit_Date[-1],Visit_Date)<=6,S=1,1),0))):Office_Visit, S:
SX_past_6mo)

A1:通过JDBC从 sas 表取数,Visit_code,Visit_Date 的顺序排序。

A2:按 Id 分组,根据分组新建二维表。~ 表示当前组,Visit_code[-1] 表示上一条记录的 Visit_code 字段,interval@m 用于求月份的间隔。

来源:https://stackoverflow.com/questions/78443712/indicate-whether-a-date-is-6-months-before-another-date-for-the-same-id-column