#sas #enterprise-guide
Вопрос:
Мне нужно загрузить кучу данных из базы данных Oracle, используя, например, SAS. Для этого мне нужно преобразовать следующий код в Oracle SQL. Может кто-нибудь, пожалуйста, помочь?
Data have;
Infile datalines delimiter=',';
Input A $ B C;
Datalines;
abc123,5,1
abc123,5,2
abc123,5,3
abc123,10,4
abc123,10,5
abc123,10,6
abc123,20,7
;
Run;
Proc sort data=have;
By a b c;
Run;
Data want;
Set have;
By A B;
If first.B;
Run;
Комментарии:
1. Что произойдет, если вы используете Oracle passthrough на этапе обработки данных, используя свою логику? Приведет ли он всю таблицу в SAS, а затем выполнит фильтрацию? Если вы хотите проверить это, получите только несколько строк, добавьте следующую опцию:
options sastrace=',,,d' sastraceloc=saslog;
2. Являются ли они переменными, отличными от A, B и C, в фактическом наборе данных, который вы создаете? Если да, то включите его в свои данные примера.
Ответ №1:
Если у вас есть только эти три переменные, это легко.
proc sql;
create table want as
select distinct a,b,c
from have
group by a,b
having c=min(c)
;
quit;
Результаты:
Obs A B C
1 abc123 5 1
2 abc123 10 4
3 abc123 20 7
Комментарии:
1. Я не думаю, что это сработало бы при передаче в Oracle, не так ли?
2. @Joe Вы имеете в виду, сможет ли SAS преобразовать этот запрос в SQL для запуска в базе данных с помощью неявного passthru? Не уверен.
3. Нет; Я имею в виду, что sql недопустим в oracle. В группе by нет c, так что это не законно. Только САС могла это допустить.
Ответ №2:
Первое, что я бы сделал, — это то, что сказал Стью; протестируйте, как это делается в прошлом.
libname oralib oracle [connection options];
options sastrace=',,,d' sastraceloc=saslog;
Data want;
Set oralib.have;
By A B;
If first.B;
Run;
Прямо это и посмотрите, работает ли это так, как вы хотите. Это может сделать то, что вам нужно. Вам не нужно proc sort
, сортировка будет происходить в базе данных.
Однако, если это не так, и я подозреваю, что на самом деле это не пройдет через все это, так как это напрямую не поддерживается, я не думаю, что вы можете сделать это в SQL pass through.
Вот базовый эквивалент кода SAS:
proc sql;
select distinct country, region, actual
from sashelp.prdsale main
where actual = (
select min(actual)
from sashelp.prdsale sub
where sub.country = main.country
and sub.region = main.region
);
quit;
Это код, совместимый с oracle, вам просто нужно заменить фактическую таблицу/переменные и завернуть ее в сквозной, т. Е.
proc sql;
connect to oracle [connection options];
select * from connection to oracle (
... your query here ...
);
quit;
Кстати distinct
, он не нужен, если вы знаете, что он вернет только одну строку на запись без него.