#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