如何从SAS中设置的日期获取系列的最后一个非空列

时间:2018-01-27 08:18:01

标签: sql sas sas-macro

我正在开发SAS应用程序,我的数据集为

dim_point
rk | ID    | name  | value_0 | value_1 | value_2 | value_3 | value_4
1  | one   |  one  |  val_0  |  val_1  |  val_2  |  val_3  |   .
2  | two   |  two  |  val_0  |  val_1  |  val_2  |    .    |   .
3  | three | three |  val_0  |    .    |    .    |    .    |   .
4  | four  | four  |  val_0  |  val_1  |    .    |    .    |   .

我希望将其他列和最后一个非空列的值作为

want
rk | ID    | name  |  value
1  | one   |  one  |  val_3
2  | two   |  two  |  val_2
3  | three | three |  val_0
4  | four  | four  |  val_1

我正在尝试的代码是

proc sql noprint;
create table want as
select rk, ID, name, name as value
from dim_point;

update want 
set value = "";
quit;

我不知道如何使用value_ series的最后一个非空列值来更新value列?

2 个答案:

答案 0 :(得分:0)

以相反顺序使用coalesce

set value = coalesce(value_4,value_3,value_2,value_1,value_0);

您可能需要使用coalescec代替字符变量。

答案 1 :(得分:0)

虽然当您知道所有列时coalesce解决方案很好,但可能会出现这些情况,这些情况可能会发生变化,或者明显更多。

在这种情况下,您可以使用数组:

data want ;
  set have ;
  array _v{*} value_: ; /* colon operator is a wildcard, loaded in the same order as the input dataset */

  /* Loop backwards over the array, stop when we find a non-missing value */
  do i = dim(_v) to 1 by -1 until (not missing(value)) ;
    if not missing(_v{i}) then value = _v{i} ;
  end ;

  drop i ;
run ;