将所有内容放入sas sql

将所有内容放入sas sql,sas,Sas,我有两个代码,一个是procsql,另一个是proc和datastep。两者都是相互关联的数据集 下面是proc sql行 create table new as select a.id,a.alid,b.pdate from tb a inner join tb1 act on a.aid =act.aid left join tb2 as b on (r.alid=a.alid) where a.did in (15,45); quit; 下面是从上面的datatset new创建的

我有两个代码,一个是procsql,另一个是proc和datastep。两者都是相互关联的数据集

下面是proc sql行

 create table new as select a.id,a.alid,b.pdate from tb a inner join 
tb1 act on a.aid =act.aid left join tb2 as b on (r.alid=a.alid) where 
a.did in (15,45); quit;
下面是从上面的datatset new创建的过程和数据步骤

    proc sort data = new uodupkey;
    by alid;

   data new1;
   set new;
   format ddate date9.
   dat1=datepart(today);
   datno=input(number,20.);
   key=_n_;
   rename alid blid;
   run;

   proc sort data=new1 nodupkey;
   by datno dat1;
   run; 

我需要将所有内容都放在单个proc-sql步骤中。

您提到了两个数据步骤,但我只看到一个

无论如何,您的数据步骤和过程排序确实可以写入一个sql查询中(然后您可以将其插入
proc sql
):

不过有一句话。您的数据步骤需要在输入数据集中
new
使用名为
ddate
today
number
的变量。如果该数据集应该是第一次sql查询的结果,那么这些变量不存在,它们的值以及
new1
中的
dat1
datno
的值将始终丢失。 另外,我假设您在
proc sort
上拼错了
nodupkey

编辑:或者,将其全部放在同一个查询中(如果这是“相同的过程sql”的意思):


您真的需要使用记录的顺序生成键变量吗?您可以尝试使用不支持的
monotonic()
函数。您好,欢迎使用堆栈溢出。请阅读并修改您的问题,使其包含您为解决此问题而编写的代码,和/或将您的问题集中在您遇到问题的特定问题上,而不是要求我们为您编写代码。您能否解释当前使用带NODUPKEY选项的PROC SORT的原因?每个ALID值是否有多个观测值?选择其中一个的标准是什么?你能更好地解释你的问题吗?还包括一些示例输入和输出数据,以演示您试图解决的问题。请注意,您发布的代码有拼写错误,并且SQL代码、数据和过程步骤似乎没有引用相同的表,因为变量名称不相同。我强烈建议不要将
MONOTONIC()
groupby
一起使用,这正是它的行为可能与预期不同的地方。事实上,我很确定这里的
与数据步骤中的
不同,因为它是按
alid
排序的,而在这里它的行为就好像是按
datno排序一样,dat1
计算单调时。我们为什么在这里使用groupby?你能解释一下密码吗。我有两个进程排序step@Joe,正如Tom在上面的评论中指出的,询问者使用的是
proc sort nodupkey
,没有明显的标准来保存一个“dup”记录。因此,
monotonic()
groupby
的结果行为似乎没有多大关系。@suresh999,我们在这里使用
groupby
来重现类似于
proc sort
上的
nodupkey
选项的行为。
proc sql;
  create table new1 as
  select id
        ,alid as blid
        ,pdate
        ,datepart(today) as dat1
        ,input(number,20.) as datno
        ,monotonic() as key
  from new1
  group by datno, dat1
  having key=min(key)
  ;
quit;
proc sql;
  create table new1 as
  select id
        ,alid as blid
        ,pdate
        ,datepart(today) as dat1
        ,input(number,20.) as datno
        ,monotonic() as key
  from (
        select a.id,a.alid,b.pdate
        from tb a
        inner join tb1 act
          on a.aid =act.aid
        left join tb2 as b
          on (r.alid=a.alid)
        where a.did in (15,45)
        )
  group by datno, dat1
  having key=min(key)
  ;
quit;