如何在SAS数据集中同时选择一个字段的第一次出现和另一个字段的最后一次出现?

时间:2019-02-04 13:04:13

标签: sql sas

我有一个SAS数据集(按ID分组,Sub_ID按ID排序),如下所述,

ID        Sub_ID      Field_1         Field_2
1            4           4               8
1            5           9               5A

所需的输出(输出数据集中不需要Sub_ID)

ID        Field_1         Field_2
1            4               5A

我想做什么?

我需要为每个ID提供一个单行输出,其中Field_1的值应与该特定ID的第一次出现相同,而Field_2应当与该特定ID的最后一次出现相同。

如果我使用First.ID,则输出为

ID        Field_1         Field_2
1            4               8

如果我使用Last.ID,则输出为

ID        Field_1         Field_2
1            9               5A

我不确定如何结合这两个条件。

3 个答案:

答案 0 :(得分:0)

您需要做的就是将第一个值存储在新变量中(使用retain语句将其复制到行中),然后在达到每个ID的最后一个值时输出。 以下代码将根据数据的当前排序顺序执行此操作。我假设您的真实数据有一​​个额外的变量,可以对数据进行正确的排序。

data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;

data want;
set have;
by id;
retain field_1_1st;
if first.id then field_1_1st = field_1;
if last.id then do;
    field_2_last = field_2;
    output;
    end;
drop field_1 field_2;
run;

答案 1 :(得分:0)

@longfish答案是完美的,这只是SQL中的另一种方式。

data have;
input ID        Field_1         Field_2 $;
datalines;
 1            4               8
 1            5               9
 1            9               5A
 ;


  data have_1/view=have_1;
  set have;
  val =_n_;
  run;

   proc sql;
    create table want as 
   select id, field_1,
 max(case when Field_2 =(select field_2 from have_1
                group by id having val=max(val))
      then field_2 end) as field_2
 from have_1
group by id
having val=min(val);

enter image description here

答案 2 :(得分:0)

这是另一个数据步骤解决方案,使用DOW循环而不是保留:

data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;

data want;
do until(last.id);
  set have;
  by id;
  if first.id then field_1_1st = field_1;
end;
field_1 = field_1_1st;
drop field_1_1st;
run;

这将轮流加载每一行,但仅输出每个id的最后一行,因此您不必特殊处理该行。

仅当您的输入数据集包含名为field_1_1st的字段时,此方法才有效。如果是这样,则不会结转每个id的第一行中的值。