融合的神秘价值观

时间:2016-06-23 14:05:49

标签: merge sas proc proc-sql

所以我有一个相对复杂的过程,可以从netezza数据仓库中提取大量数据。我的任务是在流程中添加两个新字段,并经历了通常的繁琐操作,即将新字段添加到每个类别,组,依据等等。尽管字段通过,但我始终将数据运行高达~12%。

作为一个诊断工具,我在插入或合并新数据的每个子句之后插入了proc摘要,并将其分离为两个proc SQL语句

proc sql;
  create table ACTUALALL_CD2 as 
  select stay_y, timeframe, daysout, Stay_mo
  from ACTUALALL_CD
  where stay_y = &curyr
  group by stay_y, timeframe, daysout, Stay_mo
  order by daysout, Stay_mo;
quit;

proc sort data=ACTUALALL_CD2 nodupkey; 
  by stay_y timeframe daysout Stay_mo; 
run;

proc sql;
  create table ACTUALALL_CD3 as
  select 
    a.WeekN, a.timeframe, a.timen, a.week, a.daysout,
    a.wdwe,a.marsha, a.room_pool_cd, a.cd_tier_rpgm, a.month_cal_id,   
    a.market_prefix_cd , a.yrpd2, a.stay_y, b.Stay_mo,a.Curr_code,
    a.fxmonth, a.fxrate,a.yrpd, a.yrmon,  a.Month, 
    a.RN_TY as RNTY, a.rev_ty as RVTY, a.USDRVTY, a.RVTY_CDUS, 
    a.Holiday_date, a.RN_LY as RNLY,
    a.rev_ly as RVLY, a.USDRVLY, a.RVLY_CDUS
  from ACTUALALL_CD a
  inner join ACTUALALL_CD2 b 
    on b.daysout = a.daysout;
quit;

在我的原始代码中,我从daysout字段中丢失了一个值(值为1-18的字段中的值为7)(我想要这样做)并且反过来会削减我的输出值。相比之下,这段代码(此代码和遗留代码之间的差异是添加的值a.room_pool_cd和a.cd_tier_rpgm)。

我需要弄清楚如何使这个代码也切掉这个值。我和两个人结合了40年的sas经验并且他们做得很短。我们非常感谢您对编辑或重写的建议。

1 个答案:

答案 0 :(得分:0)

在提供的查询中看起来没什么异常,所以我建议以下内容以确保:

  1. 重新启动SAS会话。确保没有任何奇怪的事情与之前的运行交互。
  2. 确保您没有意外按下F4键并意外地将任何提交的代码复制/粘贴到编辑器窗口中(如果您使用的是Base SAS编辑器)。
  3. 在日志中搜索error:warning:repeats of BY values字样。
  4. 如果这些都不起作用,那么解决它的真正方法是识别具有不同计数的密钥(在原始查询和新查询之间)。将原始查询和新查询限制为只有(一个)这些键并从那里开始调试。从新查询中删除内容,直到记录数量达到预期结果,然后您就找到了问题。这是隔离和解决问题的一种保证方法,但不是人们一直在寻找的快速解决方案。