Отфильтруйте набор данных SAS, чтобы он содержал только идентификаторы, указанные в списке.

Я работаю в руководстве SAS Enterprise и имею таблицу SAS с одним столбцом, содержащую уникальные идентификаторы (id_list).

Я хочу отфильтровать другую таблицу SAS, чтобы она содержала только наблюдения, которые можно найти в id_list.

Мой код до сих пор:

proc sql noprint;
    CREATE TABLE test AS
    SELECT *
    FROM  data_sample
    WHERE id IN id_list
quit;

Этот код дает мне следующие ошибки:

Error 22-322: Syntax error, expecting on of the following: (, SELECT.

Что я делаю не так?

Заранее спасибо за помощь.


person MRR    schedule 20.02.2017    source источник


Ответы (3)


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

CREATE TABLE test AS
  SELECT *
  FROM data_sample
  WHERE id IN (select id from id_list)
;
person Tom    schedule 20.02.2017
comment
Я на самом деле закончил тем, что пошел с этим. Ответ Эндрюса дал мне некоторые проблемы (которые, безусловно, могли быть решены). Огромное спасибо. - person MRR; 21.02.2017

Вы можете использовать объединение в proc sql, но, вероятно, проще использовать слияние в шаге данных с оператором in=.

data want;
  merge oneColData(in = A) otherData(in = B);
  by id_list;

  if A;

run;

Вы объединяете два набора данных вместе, а затем, используя if A, берете только идентификаторы, которые появляются в наборе данных с одним столбцом. Чтобы это работало, вы должны объединить id_list, которые должны быть в обоих наборах данных, и оба набора данных должны быть отсортированы по id_list.

person Andrew Haynes    schedule 20.02.2017
comment
Это выглядит великолепно. Один вопрос: если у меня есть несколько записей в otherData с одинаковым уникальным идентификатором из id_list, все ли они будут сохранены в наборе выходных данных? - person MRR; 20.02.2017
comment
Да, они должны, это слияние один ко многим. Если вы сомневаетесь, создайте игрушечный набор данных и проверьте его. - person Andrew Haynes; 20.02.2017

Проблема с использованием шага данных вместо PROC SQL заключается в том, что для шага данных набор данных должен быть отсортирован по переменной, используемой для слияния. Если это еще не так, сначала необходимо отсортировать полный набор данных.

Если у меня есть очень большой набор данных SAS, который не отсортирован по объединяемой переменной, я должен сначала отсортировать его (что может занять довольно много времени). Если я использую подзапрос в PROC SQL, я могу выборочно читать набор данных, поэтому сортировка не требуется.

Могу поспорить, что PROC SQL намного быстрее для больших наборов данных, из которых вам нужно только небольшое подмножество.

person Ruben ten Cate    schedule 13.06.2018