SAS随记

来源:互联网 发布:linux多线程 编辑:程序博客网 时间:2024/05/16 03:08

最近老系统的sas代码在计算过程中,出现了少数据的情况,我经过了几次检查代码后,还是未发现问题。

最后在一个资深同事帮助下,发现了问题的原因,但是自己回想起来还是觉得自己细心的程度不够和如何调试SAS代码不够熟练,说明如下:

在代码中主要是以下这段代码(敏感地方将略去):


data test.top_order_merge2;

merge

source.order_sub_1(in=a)

source.order2(in=b keep=col1 col2 col3 col4 col5 col6 state col7) ;   /*这里将其他字段变成col前缀,主要是state)

by col1 col2;

if a and b;

run;


就是这段代码,merge的用意是a表示来自order_sub_1,b表示来自order2。

keep的意思就是保留order2中那些字段,但我当时把state看成了status了。

当两张表有重复的字段的值,后一张表的值将覆盖前一张表里的值。


因为把state看成了status了,所以后面就成了定向思维,一厢情愿的认为top_order_merge2表里的值就是来自order2表的state列的值。

因为order2中state的有效状态值只有5个,但order_sub_1里的state的有效状态值有10个。这样其实是有10个状态值,而我认为就是5个状态值(这样就不会掉记录),但实际的情况是在后续的检查中,自然就会过滤掉部分状态的记录。

所以导致该出来的数据没有在结果集里出现。

后来通过其他同事帮忙,一步步运行和生成结果集检查后,才发现state来自order_sub_1里state的值,而后续SAS在判断条件中是按order2里state值来判断,自然就会有遗漏。


从这件事情总结:

第一:SAS检查代码与开发语言检查不同。是一步步运行每个SQL,去查看结果集

第二:细心程度需要提高,别一味想当然

第三:状态值捕捉不全面

第四:对SAS语法熟练程度不够,因为不是经常用,有时候间隔一段时间才会去用,而这段时间里很容易忘记。

以后会更加注意这样的情况,避免再次重复发生。