[英]Cartesian Join SAS Proc SQL
我有两个看起来像这样的数据集:
data sales;
format week date9.;
input store $ week date9. sales;
cards;
A 01JAN2014 200
A 08JAN2014 500
A 22JAN2014 200
B 01JAN2014 100
B 08JAN2014 200
B 15JAN2014 200
;
run;
data dates;
format week date9.;
input week date9.;
cards;
01JAN2014
08JAN2014
15JAN2014
22JAN2014
29JAN2014
;
run;
这些是数据库中非常大的表的小示例。 我想使用proc sql步骤将其加入,以便每个位置均显示所有日期(如果没有销售,则缺少值)。 我一直在创建商店和几周的笛卡尔连接以产生期望的结果,但是事实证明,当我尝试查询大量数据时,此方法效率极低。 我知道有一个更好的方法可以做到这一点,但无法做到。 下面是我的尝试...以澄清一下,full_sales数据集是所需的输出,我只需要一种更有效的方法即可。 谢谢。
proc sql;
create table cartesian as
select distinct sales.store, dates.week
from sales, dates
order by 1,2;
quit;
proc sql;
create table full_sales as
select cartesian.store,
cartesian.week,
sales.sales
from cartesian
left join sales
on cartesian.store=sales.store and
cartesian.week=sales.week
order by 1,2
;
quit;
我将其作为:
proc sql;
create table full_sales as
select s.store, w.week, ssa.sales
from (select distinct store from sales) s cross join
dates w left join
sales sa
on s.store = sa.store and
w.week = sa.week
order by 1,2
;
quit;
这不需要辅助表cartesian
,这可能会更快。 sales(store, week)
的索引肯定会加快查询速度。
我将推荐一种替代方法,该方法包括从DATES数据集创建格式,然后在proc summary
使用completetypes
和preloadfmt
输出所有观察值。
这假定所有必需的日期都出现在DATES数据集中(即SALES中没有日期没有出现在DATES中)。 这可能比使用proc sql
更快。
我在最后添加了一个步骤,将格式更改回标准date9.
因为您可能会遇到人们使用用户定义的wk_fmt.
打开数据集的问题wk_fmt.
格式。
data sales;
format week date9.;
input store $ week :date9. sales;
cards;
A 01JAN2014 200
A 08JAN2014 500
A 22JAN2014 200
B 01JAN2014 100
B 08JAN2014 200
B 15JAN2014 200
;
run;
data dates;
format week date9.;
input week :date9.;
cards;
01JAN2014
08JAN2014
15JAN2014
22JAN2014
29JAN2014
;
run;
/* create dataset with format details */
data week_format;
set dates;
rename week = start;
retain fmtname 'wk_fmt' type 'N';
label = vvalue(week);
run;
/* load format from previous dataset */
proc format cntlin=week_format;
run;
/* create table of all combinations of store and dates */
proc summary data = sales nway completetypes;
class store;
class week / preloadfmt;
format week wk_fmt.;
id sales;
output out=want (drop=_:);
run;
/* change format back to date9. */
proc datasets lib=work nodetails nolist;
modify want;
format week date9.;
quit;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.