繁体   English   中英

笛卡尔联接SAS Proc SQL

[英]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使用completetypespreloadfmt输出所有观察值。

这假定所有必需的日期都出现在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM