问题描述
我需要使用 SAS EG 从 Oracle 数据库下载一堆数据。为此,我需要将以下代码转换为 Oracle sql。有人可以帮忙吗?
Data have;
Infile datalines delimiter=',';
Input A $ B C;
Datalines;
abc123,5,1
abc123,2
abc123,3
abc123,10,4
abc123,5
abc123,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;
解决方法
如果你只有这三个变量,那就很容易了。
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
,
我要做的第一件事就是斯图所说的;在直通中测试这样做。
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兼容的代码,你只需要替换实际的表/变量并将其包装在pass through中,即
proc sql;
connect to oracle [connection options];
select * from connection to oracle (
... your query here ...
);
quit;
顺便说一下,如果您知道没有 distinct
将只返回每条记录的一行,则不需要它。