楼主: yukai08008
1596 3

[程序分享] 数据更新宏sas代码_Andy的原创帖6 [推广有奖]

  • 2关注
  • 17粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
2176 个
通用积分
3.0600
学术水平
10 点
热心指数
7 点
信用等级
7 点
经验
5915 点
帖子
120
精华
0
在线时间
556 小时
注册时间
2012-11-28
最后登录
2022-4-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
用于根据日期从数据库/数据仓库中增量抽取数据,和之前提到的检测宏配合起来用,就是完成的数据增量抽取/检验。
数据更新有两种类型:
1、顺序拼接
2、数据更新(历史记录某些字段被刷新)
以下仅举一个顺序拼接的例子:
********************************************************************************************
第一部分:参数设定
1、test.a是本地库待更新的表
2、atime是a表中的格式,为date型
3、database.b是数据库的表
4、btime为b表中格式为时间戳形式。
%let alpha1=test.a;
/*atime 是date格式*/
%let alpha2=atime;
%let alpha3=database.t1;
%let alpha5=t1_s;
/*btime 是datetime格式*/
%let alpha4=btime;
********************************************************************************************
第二部分:调用宏
1、back对现有数据做一些回退,避免少数越界的数据
2、read根据回退的值增量抽取新数据
3、tad对时间戳的时区做转换(已经是东八区的时间就不必要做)
4、对数据库抽取出来的数据做一些个性化的调整,比如选取的变量,重命名等。
5、把数据拼接
%back(&alpha1,&alpha2)
%read(&alpha3,&alpha4)
%tad(&alpha5,&alpha4)
data adjust;
set &alpha5;
&alpha2=datepart(&alpha4);
run;
%append(&alpha1,adjust,&alpha2)
proc delete data=&alpha5 adjust;
run;

********************************************************************************************
以下是宏(dsort是根据主键去重的宏,不再贴出来),6和7在第二种更新方式的时候用。


/*1 回退宏_取现有数据回退一天的时间,结果存入back_last 全局宏变量 */
%macro back(inset,key);
%global back_last;
data aa1;
set &inset;
run;
%dsort(aa1,&key)
data _null_;
if 0  then set aa1 nobs=a;
set aa1;
if _n_=a-1;
call symput('back_last',&key);
run;
proc delete data=aa1;
run;
%mend;
/*2 名字宏_对给定的临时数据加后命名,结果存入nm_app 全局宏变量*/
%macro nm(inset,append);
%global nm_app;
data _null_;
a=substr("&inset",find("&inset",'.')+1);
b=cats(a,"&append");
call symput('nm_app',b);
run;
%mend;
/*3 数据读取宏_从数据仓库截取新数据_依赖于全局宏变量 back_last*/
%macro read(inset,key,itv=2);
data _null_;
a=symget('back_last');
b=(a-&itv)*24*3600;
call symput('new_read',b);
run;
%nm(&inset,_s)
data &nm_app;
set &inset;
where &key gt &new_read;
run;
%mend;
/*4 时间调整宏_格林尼治时间转东八区*/
%macro tad(inset,key);
data &inset;
set &inset;
&key=&key+8*3600;
run;
%mend;
/*5 数据拼接_依赖于全局宏变量back_last*/
%macro append(master,append,key);
data &master;
set &master(where=(&key<=&back_last)) &append(where=(&key > &back_last));
run;
%mend;
/*6 更新宏*/
%macro update(inset,up,key);
%sort(&inset,&key)
%sort(&up,&key)
data &inset;
update &inset &up;
by &key;
%mend;
/*7 对是否有重复主键检查,若有错误则写入临时日志*/
%macro duperr(inset,key);
proc sql;
create table dupaa1 as
select &key,count(*) as cnt from &inset
group by &key
having cnt > 1;
quit;
%if %sysfunc(exist(dupaa1)) %then %do;
data err;
retain setname;
set dupaa1(keep=&key);
if _n_=1;
errtype='DUP';
setname=symget('inset');
run;
%if %sysfunc(exist(err)) %then %do;
data errlog;
set err errlog;
run;
%end;
%end;
%mend;


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sas代码 数据更新 Andy database proc sql 增量抽取 sas 数据库 数据仓库

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 3 + 3 + 3 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

沙发
co_fund 发表于 2016-2-3 11:38:19 |只看作者 |坛友微信交流群
加油,支持原创

使用道具

藤椅
yukai08008 在职认证  发表于 2016-2-3 15:32:26 |只看作者 |坛友微信交流群
谢谢      

使用道具

板凳
yukai08008 在职认证  发表于 2016-2-14 13:37:49 |只看作者 |坛友微信交流群
Tips: 一个用Proc SQL的理由
由于生产数据库中设置的字符集有些问题(utf8的扩展版,支持3个字节表示一个字符),因此在解释一些中文时浮标溢出了。
解决方案:
1 由数据库管理员进行字符集转换(可能会比较麻烦,特别是考虑产品的功能)
2 跳开有问题的字段,此时只能用proc sql,因为用data 步会先读入所有变量(这时候就报错终止了)

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 03:03