извлечение данных с помощью proc print или sql-запроса или еще

#sql #sas

#sql #sas

Вопрос:

Я ищу совета по этому вопросу. Некоторый контекст раньше.

У меня есть следующая таблица в SAS. Есть 711 наблюдений и еще много переменных. Ниже приведен пример из моей таблицы.

 date     col1 col2 col3
jun14     0    0    0
may14     1    0    2
apr14     1    0    3
  

В таблице нет индекса, нет первичного ключа, ничего.

Результаты, к которым я стремлюсь, — это знать на определенную дату все значения этого столбца.

 date     col1 col2 col3
may14     1    0    2
apr14     1    0    3
  

Пример для 14 мая у меня будет

Я запускаю следующий SQL-запрос к нему

 proc sql;
select * from mytable where date < (input('may14',MONYY5.));
  

Как вы можете себе представить, запрос является сложным, когда у вас много переменных и много наблюдений. Запрос запущен 50 минут назад и все еще выполняется.

Я также думал об использовании proc print

 proc print data=mytable;
var date col1 col2 col3;
where date = (input('may14',MONYY5.));
run;
  

Итак, вот мой вопрос.

Есть ли другой способ получить мои результаты, а не с помощью этого запроса или proc print? Нужно ли мне иметь datastep, подобный транспонированию, хотя, если я выполняю транспонирование, все будет по-другому (см. Ниже).

 date jun14 may14 apr14 
col1 0     1     1
col2 0     0     0
col3 0     2     3
  

Заранее спасибо за ваше понимание.

Комментарии:

1. сколько переменных — это «намного больше»? Как говорит @vasja, отсутствие QUIT; сделает вид, что PROC SQL все еще работает.

2. Привет, DomPazz, имеет ли значение, что у меня 6000 переменных?

Ответ №1:

Разве вы просто не пропускаете QUIT; select оператор after до конца PROC SQL ? Я не могу поверить, что это может занять столько времени для 771 записи.

Редактировать:

Итак, проблема заключается в создании и отображении выходных данных непосредственно в окнах SAS.

Ниже приведен журнал из моего теста с помощью PROC PRINTTO для прямого вывода в текстовый файл. Занимает менее 10 секунд. Размер файла составляет 100 МБ для 1000 записей и 10000 переменных.

Очевидно, что было бы разумнее выводить данные в некоторые другие форматы. Кроме того, какой смысл представлять пользователю тысячи значений?

 114  data mytable ;
115     format date date9.;
116     array var  {10000};
117     do i=1 to 10000;
118        var(i)=i;
NOTE: The array var has the same name as a SAS-supplied or user-defined function.  Parentheses
      following this name are treated as array references and not function references.
119     end;
120     do i=1 to 1000;
121        date = i;
122        output;
123     end;
124  run;

NOTE: The data set WORK.MYTABLE has 1000 observations and 10002 variables.
NOTE: DATA statement used (Total process time):
      real time           0.13 seconds
      cpu time            0.12 seconds


125
126  ods html close;* no html output;
127  ods listing; *text output rather;
128
129  proc printto print="E:sasoutput.lst";run;

NOTE: PROCEDURE PRINTTO used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


129!                                           * output to file;
130  proc sql;
131  select * from mytable where date < '1may2014'd;
132  ;
133  quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           9.35 seconds
      cpu time            8.57 seconds


134
135  %put amp;SQLOBS;
1000