SAS, где точное соответствие условиям

Спасибо за отзывы, ребята, но я должен переписать вопрос, чтобы сделать его более понятным.

Скажем, у нас есть таблица:

Таблица

То, что я пытаюсь получить из этой таблицы, представляет собой список чисел, у которых даты FP_NDT совпадают с моим условием, например, я хочу получить список чисел, у которых только FP_NDT не равен нулю для 2014 и 2015 годов и отсутствуют значения для 2011 года. , 2012 и 2013 (независимо от месяца). Так что с этим условием я должен получить только номер 4. Можно ли это сделать из этой таблицы?

PS: если я напишу простой оператор выбора sql и поставлю условие, например

where year(FP_NDT) in (2014,2015)

это также дало бы мне номера 2 и 3 ...


person Kvadich    schedule 21.04.2016    source источник
comment
Проще проверить, если вы вставите свои данные в виде текста, а не фотографируете их.   -  person Tom    schedule 26.04.2016


Ответы (4)


Почему бы сначала не обобщить данные?

proc sql;
  create table XX as
    select number
         , max(year(fp_ndt)=2011) as yr2011
         , max(year(fp_ndt)=2012) as yr2012
         , max(year(fp_ndt)=2013) as yr2013
         , max(year(fp_ndt)=2014) as yr2014
         , max(year(fp_ndt)=2015) as yr2015
    from table1
    group by number
  ;

Теперь легко сделать ваши тесты.

  select * from XX 
    where yr2014+yr2015=2 and yr2011+yr2012+yr2013=0
  ;

Вы можете использовать первый запрос как подзапрос вместо создания физической таблицы.

person Tom    schedule 26.04.2016

Таким образом, вы хотите, чтобы имена ассоциировались как с 1, так и со 2 и с 3, но в разных строках.

Вы можете группировать строки по именам и подсчитывать связанные числа следующим образом:

PROC SQL;
    CREATE TABLE xxx AS SELECT 
           name, 
           SUM(number=1) AS count1,
           SUM(number=2) AS count2,
           SUM(number=3) AS count3
    FROM test GROUP BY name;
QUIT;

Затем вы можете отфильтровать результаты на основе count1-count3, то есть (count1>0 AND count2>0 AND count3>0).

person Feng Jiang    schedule 21.04.2016
comment
Спасибо, это имеет смысл, но когда важна совокупность, скажем, я хочу, чтобы 2 пропали без вести за последние 5 лет. К сожалению, это не помогает выяснить, нужен ли мне именно предыдущий, а тот, что был до предыдущего, отсутствует... - person Kvadich; 26.04.2016
comment
На самом деле он делает то же самое, что и ответ с max(). Извините, что не заметил этого раньше и спасибо! - person Kvadich; 27.04.2016

Попробуй это:

proc sql;
select *
from work.test
group by name having nmiss(number)=0;
quit;
person Shenglin Chen    schedule 21.04.2016
comment
Мне на самом деле нужно получить в результате имя, в котором есть определенные числа и некоторые отсутствуют для других чисел... Например, из последней таблицы, как я могу выбрать только Luk? Вероятно, я мог бы сделать это так же, как вы предложили, если бы порядок отсутствующих переменных не имел значения, но, к сожалению, это имеет значение. В этом примере мне особенно нужно, чтобы для Luk отсутствовало 3, а 1 и 2 не были нулевыми... - person Kvadich; 22.04.2016

Я нашел один обходной путь, который заключается в том, чтобы фактически создавать отдельные наборы данных для каждого года, а затем внутренне соединять их с условием where для отсутствующих, а не нулевым для необходимых лет. Однако это становится немного громоздким, например, когда речь идет о 60 месяцах...

person Kvadich    schedule 26.04.2016