Удалить дубликаты в SAS, аналогичные функции ROW_NUMBER() в Oracle.

Я использую схему SCOTT в оракуле и хочу удалить повторяющиеся значения, подобные этому...

SELECT   EMPNO, JOB, SAL
  FROM   (  SELECT   EMPNO,
                     JOB,
                     SAL,
                     ROW_NUMBER () OVER (PARTITION BY EMPNO ORDER BY SAL) R_ID
              FROM   EMP_TEST
          ORDER BY   EMPNO)
 WHERE   R_ID = 1

Прямо сейчас я хочу выполнить это в SAS... и следующий код работает нормально....

PROC SQL;
connect to oracle (PATH="database_name" USER=SCOTT PASSWORD=tiger); 
CREATE TABLE WORK.EMP_DEDUPL AS SELECT * from connection to oracle(
SELECT EMPNO, JOB, SAL
      FROM   (  SELECT   EMPNO,
                         JOB,
                         SAL,
                         ROW_NUMBER () OVER (PARTITION BY EMPNO ORDER BY SAL) R_ID
                  FROM   SCOTT.EMP_TEST
              ORDER BY   EMPNO)
     WHERE   R_ID = 1
);
DISCONNECT FROM oracle;
QUIT;

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

Предположим, что мой EMP_TEST не является таблицей оракула, это фактически набор данных SAS по определенному пути, и я хочу создать другой набор данных с именем EMP_DEDUP из набора данных EMP_TEST после удаления повторяющихся значений. Это мой подход.

PROC SQL; 
CREATE TABLE WORK.EMP_DEDUPL AS SELECT * from connection to oracle(
SELECT EMPNO, JOB, SAL
      FROM   (  SELECT   EMPNO,
                         JOB,
                         SAL,
                         ROW_NUMBER () OVER (PARTITION BY EMPNO ORDER BY SAL) R_ID
                  FROM   path.EMP_TEST
              ORDER BY   EMPNO)
     WHERE   R_ID = 1
;
QUIT;

Здесь я обнаружил синтаксическую ошибку..... возможно, SAS не поддерживает функцию ROW_NUMBER(). Любое возможное решение.. может кто-нибудь предложить...


person goldenbutter    schedule 24.01.2014    source источник
comment
Я мог видеть открывающую скобку ...connection to oracle(, но ее закрывающая скобка отсутствует. Это правильный синтаксис?   -  person San    schedule 24.01.2014
comment
Если path.EMP_TEST является набором данных SAS, вы не можете применить к нему функцию ROW_NUMBER(). Зачем возиться с PROC SQL для дедупликации набора данных SAS, когда уже есть отличная процедура, позволяющая сделать именно это. См. PROC SORT with NODUPKEY option   -  person    schedule 24.01.2014
comment
К сожалению, вы не можете сделать это за один шаг с помощью NODUPKEY.   -  person Joe    schedule 24.01.2014
comment
В SAS есть недокументированная функция под названием monotonic(), которая возвращает (выходной) номер наблюдения. Однако это может немного отличаться от функции row_number() в оракуле.   -  person Robert Penridge    schedule 28.01.2014
comment
@San .. извините .. это была опечатка ... ) добавлены фигурные скобки ...   -  person goldenbutter    schedule 29.01.2014


Ответы (2)


Похоже, вам нужен самый низкий SAL для каждого EMPNO, верно?

proc sort data=path.emp_test;
by empno sal;
run;

data work.emp_dedupl;
set path.emp_test;
by empno sal;
if first.empno;
run;

SAS не поддерживает PARTITION OVER, поэтому он не позволит вам сделать это в SQL.

person Joe    schedule 24.01.2014
comment
у меня есть вопрос... этот код даст тот же результат, что и в оракуле??? завтра протестирую. - person goldenbutter; 29.01.2014

Если аналитические функции не поддерживаются, то можно написать что-то вроде этого

PROC SQL; 
CREATE TABLE WORK.EMP_DEDUPL AS SELECT * from connection to oracle(
SELECT EMPNO, JOB, SAL
      FROM  path.EMP_TEST
     WHERE rowid in (select min(rowid) 
                      from path.EMP_TEST
                     group by empno)
);
QUIT;   
person San    schedule 24.01.2014