【问题标题】:Put everything into sas sql将所有内容放入sas sql
【发布时间】:2017-10-05 15:38:31
【问题描述】:

我有两个代码,一个是 proc sql,另一个是 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 和 datasteps。

    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 步骤中。

【问题讨论】:

  • 你真的需要使用记录的顺序生成KEY变量吗?您可以尝试使用不受支持的monotonic() 函数。
  • 嗨,欢迎来到 Stack Overflow。请阅读How to Ask,并修改您的问题以包含您为尝试解决此问题而编写的代码,和/或将您的问题集中在您遇到问题的具体问题上,而不是要求我们编写代码你。
  • 您能解释一下为什么您目前使用 PROC SORT 和 NODUPKEY 选项吗?每个 ALID 值是否有多个观察值?只选择其中一个的标准是什么?
  • 你能更好地解释你的问题吗?还包括一些示例输入和输出数据,以演示您要解决的问题。请注意,您发布的代码有拼写错误,并且 SQL 代码和数据以及 proc 步骤似乎没有引用相同的表,因为变量名称不同。

标签: sas


【解决方案1】:

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

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

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;

不过有一点。您的数据步骤需要输入数据集new 中名为ddatetodaynumber 的变量。如果该数据集应该是您的第一个 sql 查询的结果,那么这些变量不存在,并且它们的值以及 new1 中的 dat1datno 的值将始终丢失。 另外我假设你在proc sort 上拼错了nodupkey

编辑:或者,将它们全部放在同一个 查询 中(如果这就是您对“相同的 proc sql”的意思):

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;

【讨论】:

  • 我强烈反对将MONOTONIC()group by 一起使用,这正是它的行为可能与预期不同的地方。
  • 事实上,我很确定这里的 key 与数据步骤中的 key 不同,因为它是按 alid 排序的,而在这里它会表现得好像是计算单调时按datno, dat1排序。
  • 为什么我们在这里使用 groupby?你能解释一下代码吗?我有两个 proc 排序步骤
  • @Joe,正如汤姆在上面的评论中指出的那样,提问者使用 proc sort nodupkey 没有明显的标准来保持一个“重复”记录而不是其他记录。因此,monotonic()group by 的结果行为似乎并不重要。
  • @suresh999,我们在此处使用group by 来重现类似于proc sort 上的nodupkey 选项的行为。
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多