0

我有一张下表

Id   Values    
 1     A          
 1     A          
 1     B          
 2     @          
 2     @
 2     @
 3     A
 3     A
 3     A
 3     A
 3     @
 4     B
 4     B
 4     B

输出:

Id   Values
 1     @
 2     @
 3     A
 4     B

在每个 Id 组中,如果所有值都是 @,我想将该 Id 的值设置为 @ 否则如果 Id 的所有值都相同(忽略@s)(例如,所有 As),将该 Id 的值设置为值 (A) 否则将 id 的值设置为 @。

这个问题已在 sqlserver 中得到解答,我正在尝试在 SAS 中复制代码,我需要在 SAS 中执行此操作。但不知何故,SAS 中的 NULLIF 不起作用。有人可以指导我如何在 SAS 中做到这一点吗?

4

2 回答 2

0

我发现 NULLIF 包含在 Fedsql Proc 中,并且当我运行以下代码时它起作用了。

proc fedsql;
select  id,
case    when    min(NULLIF(values, '@')) = max(NULLIF(values, '@'))
        and     min(NULLIF(values, '@')) ^= '@'
        then    min(NULLIF(values, '@'))
        else    '@'
        end as result
        from    mytable
        group by id;
run;
于 2019-02-26T04:05:36.717 回答
0

一种方法是计算distinct组中值的数量,并将结果分配给max(value)只有一个值时,@否则分配。

 proc sql;
   create table want as
   select id,
     case 
       when count(
          distinct 
          case 
            when value ne '@' then value
          end
          ) = 1 then max(value)
       else '@'
     end as value
   from have
   group by id
  ;
于 2019-02-25T23:40:54.963 回答