楼主: jingjixuejia035
2825 11

用PROC SQL实现搜索365天内匹配 [推广有奖]

  • 0关注
  • 0粉丝

高中生

32%

还不是VIP/贵宾

-

威望
0
论坛币
39 个
通用积分
0.8884
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
3187 点
帖子
10
精华
0
在线时间
45 小时
注册时间
2014-8-30
最后登录
2022-12-8

楼主
jingjixuejia035 发表于 2015-10-29 00:28:02 |AI写论文
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; ...
关键词:proc sql ROC sql Distinct ticker

沙发
upperice 发表于 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;

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

板凳
teqel 发表于 2015-10-29 06:06:39
你忘记group 了

报纸
upperice 发表于 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;

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

7
johnpark1 发表于 2015-10-29 10:52:27
最后加上

Group by a.id, a.ticker, a.date

8
jingjixuejia035 发表于 2015-10-29 23:53:17
upperice 发表于 2015-10-29 06:42
试试这个,累积的时候数据加长,计数后缩短,新数据
谢谢~你的code还考虑到了重复的问题~><
是不是可以先算出来重复的,再merge到原表,感觉会快一点

9
jingjixuejia035 发表于 2015-10-29 23:56:27
还面临着一个艰巨的问题!
加上了group之后,发现对了,跑10000以内的数据是没问题的,
但是到100000以上就会提示 ERROR: 执行排序失败
这个怎么解决呢,真的是数据的原因么。。。

10
jingjixuejia035 发表于 2015-10-29 23:57:57
johnpark1 发表于 2015-10-29 10:52
最后加上

Group by a.id, a.ticker, a.date
谢谢你~好厉害呀。。一眼看穿了
但是还想问,,跑十万以上的数据就会提示
ERROR: 执行排序失败
这个怎么办才好呢

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 13:02