微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL中的if first.row怎么办

如何解决SQL中的if first.row怎么办

我需要使用 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 将只返回每条记录的一行,则不需要它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。