Как это сделать, если first.row в SQL

#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 , он не нужен, если вы знаете, что он вернет только одну строку на запись без него.