全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2701 11
2015-10-29
悬赏 20 个论坛币 已解决
真心求助了><,把我所有的论坛币都用上了。。。
现在原始数据是
客户编号:ID  购物时间:date  物品编码:ticker
000000 13MAR2014 000R
000001 12MAR2014 0004
000000 11OCT2013 0006
000000 11OCT2013 000R
有一张总表记录了所有数据,然后想要最后加一列显示:每位客户在本次购物前的365天(包含当天)买过多少件不同的东西
理想结果:
000000 13MAR2014 000R 3
000001 12MAR2014 0004 2
000000 11OCT2013 0006 3
000000 11OCT2013 000R 3

000001 11OCT2013 0006 1
000000 10OCT2013 000A 1

自己怎么也琢磨不出来 ><
试着写了一点,但是原始100的数据跑出来test有了10000个观测值....
不知道为什么诶。。谁能告诉我怎么办呜呜。。。。

proc sql;
        create table test as
        select a.id,a.ticker,a.date,count(distinct b.ticker) as no
        from t1 a,t1 b
                where b.id=a.id
                and b.date<=a.date
                and b.date>=a.date-365;
        quit;


最佳答案

upperice 查看完整内容

看讨论真长知识啊。 可以先算出每人每天的no,再merge到原表。用个十万ID的fake数据试了试,没出错。 data t1; seed =12345; do ID =1 to 100000; rdm1 = ceil (abs(rand('UNIFORM') *20)); do i=1 to rdm1; date =ceil (abs(rand('UNIFORM') *5)); ticker =ceil(round(rand('UNIFORM'), .001)*15); output; end; end; format date mmddyy10.; drop seed rdm1 i; run; proc sql; ...
二维码

扫码加我 拉你入群

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

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

全部回复
2015-10-29 00:28:03
看讨论真长知识啊。
可以先算出每人每天的no,再merge到原表。用个十万ID的fake数据试了试,没出错。

data t1;
seed =12345;
do ID =1 to 100000;
   rdm1 = ceil (abs(rand('UNIFORM') *20));
   do i=1 to rdm1;
      date =ceil (abs(rand('UNIFORM') *5));
          ticker =ceil(round(rand('UNIFORM'), .001)*15);
          output;
        end;
end;
format date mmddyy10.;

drop seed rdm1 i;
run;

    proc sql;
        create table test0 as
        select a.id, a.date, count(distinct b.ticker) as no
        from t1 a,t1 b
                where b.id=a.id
                and b.date<=a.date
                and b.date>=a.date-365
        group by a.id, a.date;

                create table test as
                select a.*,b.no
                from t1   a left join test0   b
                on a.id=b.id and a.date=b.date;
        quit;
二维码

扫码加我 拉你入群

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

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

2015-10-29 00:52:32
好像例子里面原始数据写得不太对嗷。。。明白意思就好
这是最开始的1000个数据,全部基于一个顾客的
附件列表

test.xlsx

大小:24.76 KB

 马上下载

二维码

扫码加我 拉你入群

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

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

2015-10-29 06:06:39
你忘记group 了
二维码

扫码加我 拉你入群

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

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

2015-10-29 06:42:53
试试这个,累积的时候数据加长,计数后缩短,新数据<=原始数据的长度。
同一人同一天所有数据行加相同的值。
如果有人一天里买了两个同一编码的物品,在原始数据是两行,在新数据是一行。想保持原有的行数,在原始数据里加个unique record ID 吧。


proc sql;
        create table test as
        select a.id, a.date, a.ticker, b.date as date2,  b.ticker as ticker2
        from t1 a left join t1 b
        on b.id=a.id
        where b.date<=a.date
                and b.date>=a.date-365
        order by a.id, a.date, b.date;

                create table test2 as
                select  id, date, ticker, count(distinct ticker2 ) as no
                from test
                group by  id,  date, ticker;                               
        quit;
二维码

扫码加我 拉你入群

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

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

2015-10-29 08:59:06
upperice 发表于 2015-10-29 06:42
试试这个,累积的时候数据加长,计数后缩短,新数据
一步就行了,不需要两步
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群