SAS (PROC SQL) 合并/连接到之前的日期并且仅保留最近的条目

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

假设我在 SAS 中有以下两个数据集:

Have_1 - 包含每个 ID 的每月数据:

ID   Month 
1     1
1     2
1     3
1     4
1     5
1     6
1     7
1     8
1     9
1     10

Have_2 - 发生特定事件的月份列表:

ID   Month_Event 
1     4
1     9

我正在尝试将 Month_Event 从 Have_2 合并到 Have_1 上,其中 Month_Event 将为所有 ID 条目填充,其中 Month 小于或等于 Month_Event,即

想要:

ID   Month   Month_Event
1     1      4
1     2      4
1     3      4
1     4      4
1     5      9
1     6      9
1     7      9
1     8      9
1     9      9
1     10     .

我尝试过以下方法:

proc sql;
create table want as
select a.*, b.Month_Event
from have_1 as a
left join have_2 as b
on a.ID = b.ID and a.Month <= b.Month_Event;
quit;

这几乎给出了所需的输出,唯一的问题是输出不仅提供最近的 Month_Event,而是提供:

ID   Month   Month_Event
1     1      4
1     1      9
1     2      4
1     2      9
1     3      4
1     3      9
1     4      4
1     4      9
1     5      9
1     6      9
1     7      9
1     8      9
1     9      9
1     10     .

如何相应地调整我的代码以提供所需的输出?

sql merge sas left-join
1个回答
0
投票

取最小值。

首先让我们将您的列表转换为实际的 SAS 数据集。

data have;
  input ID   Month ;
cards;
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
;
data have2;
  input ID   Month_Event ;
cards;
1 4
1 9
;

现在将两者结合起来并取符合条件的最小month_event

proc sql;
create table want as
  select a.id,a.month,min(b.month_event) as month_event
  from have a left join have2 b
    on a.id = b.id 
      and a.month <= b.month_event
  group by a.id, a.month
;
quit;

结果

                      month_
Obs    ID    Month     event

  1     1       1        4
  2     1       2        4
  3     1       3        4
  4     1       4        4
  5     1       5        9
  6     1       6        9
  7     1       7        9
  8     1       8        9
  9     1       9        9
 10     1      10        .
© www.soinside.com 2019 - 2024. All rights reserved.