SAS中如何删除重复项,类似于Oracle中的ROW_NUMBER()函数

3
我正在使用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不是Oracle表,而是特定路径中的SAS数据集,我想在删除重复值后从EMP_TEST数据集创建另一个名为EMP_DEDUP的数据集。这是我的方法。

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()函数。有什么可能的解决方案吗?请问有人能建议一下吗...


我能看到开括号... connection to oracle(,但是它的闭括号缺失了。这是正确的语法吗? - San
1
如果path.EMP_TEST是SAS Dataset,则不能对其应用ROW_NUMBER()函数。当已经有一个完全可用的程序可以执行此操作时,为什么还要使用PROC SQL来去重您的SAS数据集呢?请参见“带有NODUPKEY选项的PROC SORT”。 - user1509107
不幸的是,您不能使用NODUPKEY一步完成此操作。 - Joe
SAS有一个未记录的函数叫做monotonic(),它返回(输出)观测编号。虽然这可能与Oracle中的row_number()函数略有不同。 - Robert Penridge
@San..抱歉..这是一个打字错误...已经添加了括号... - goldenbutter
2个回答

3
听起来你想要每个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实现这一功能。


我有一个问题...这段代码会给出与我在Oracle中所做的相同输出吗?明天我会测试它。 - goldenbutter

1
如果不支持分析函数,则可以编写类似以下内容的代码。
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;   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接