Оператор Nullif в sas

У меня есть следующая таблица

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

В каждой группе идентификаторов, если все значения равны @, я хочу установить значение для этого идентификатора на @, иначе, если все значения для идентификатора одинаковы (игнорируя @s) (например, все как), установите значение для этого идентификатора как это значение (A), иначе установите значение id равным @.

На этот вопрос был дан ответ в sqlserver, и я пытаюсь реплицировать код в SAS. Мне нужно сделать это в SAS. Но почему-то NULLIF в SAS не работает. может ли кто-нибудь помочь мне, как я могу сделать это в SAS?


person user10611398    schedule 25.02.2019    source источник
comment
Какой код вы пробовали? Какие сообщения отображались в журнале SAS? Какой был запрос SQL Server с NULLIF? Это связано с LINQ?   -  person Richard    schedule 26.02.2019
comment
Вам нужно будет объяснить, что такое NULLIF (и как вы его используете), если вам нужна помощь программистов SAS.   -  person Tom    schedule 26.02.2019


Ответы (2)


Один из способов — подсчитать количество значений 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
  ;
person Richard    schedule 25.02.2019

Я обнаружил, что 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;
person user10611398    schedule 26.02.2019
comment
Как nullif(values,'@') могло равняться '@'? - person Tom; 26.02.2019