楼主: Rock2000
4124 5

[有偿编程] 使用SAS SQL筛选记录 [推广有奖]

  • 1关注
  • 24粉丝

学术权威

22%

还不是VIP/贵宾

-

威望
1
论坛币
104812 个
通用积分
25.6012
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23619 点
帖子
547
精华
0
在线时间
10774 小时
注册时间
2004-5-27
最后登录
2024-4-25

20论坛币
有一批记录,格式及特征如下:
  1. ID  cish  date
  2. 001  1   2010/01/02
  3. 001  2   2010/05/12
  4. 001  1   2011/06/02
  5. 001  2   2011/10/12
  6. 002  1   2010/01/02
  7. 002  2   2010/05/12
  8. 002  1   2011/02/02
  9. 002  2   2011/06/12
  10. 003  1   2010/10/02
  11. 003  2   2011/02/12
  12. 003  1   2012/06/02
  13. 003  2   2012/10/12
复制代码
要求:
ID值相同情况下(比如ID=001),cish相邻两次记录(比如记录1及记录2,记录3及记录4)为一组数据,如果相同ID值下,两组数据最最近的时间(date)大于365天的,归于数据集A(比如ID=001的第2条及第3条),如果小于[size=14.3999996185303px]365天的,归于数据集B(比如ID=002的第2条及第3条,ID=003的[size=14.3999996185303px]第2条及第3条[size=14.3999996185303px])
[size=14.3999996185303px]

怎样实现?谢谢。

[size=14.3999996185303px]

最佳答案

albusdzx 查看完整内容

想了个不是很简便的办法 抛砖引玉 data test; input ID $ cish date yymmdd10.; datalines; 001 1 2010/01/02 001 2 2010/05/12 001 1 2011/06/02 001 2 2011/10/12 002 1 2010/01/02 002 2 2010/05/12 002 1 2011/02/02 002 2 2011/06/12 003 1 2010/10/02 003 2 2011/02/12 003 1 2012/06/02 003 2 2012/10/12 ; data test; set test; by ID; lag=dif(date); if first.ID then lag=.; run; proc sq ...
沙发
albusdzx 发表于 2017-7-14 16:49:39 |只看作者 |坛友微信交流群
想了个不是很简便的办法 抛砖引玉
data test;
input ID $  cish  date yymmdd10.;
datalines;
001 1 2010/01/02
001 2 2010/05/12
001 1 2011/06/02
001 2 2011/10/12
002 1 2010/01/02
002 2 2010/05/12
002 1 2011/02/02
002 2 2011/06/12
003 1 2010/10/02
003 2 2011/02/12
003 1 2012/06/02
003 2 2012/10/12
;

data test;
set test;
by ID;
lag=dif(date);
if first.ID then lag=.;
run;

proc sql;
create table a as
select * from test where id  in (select ID from test where lag>365);
create table b as
select * from test where id not in (select ID from test where lag>365);
quit;
已有 2 人评分学术水平 热心指数 收起 理由
Rock2000 + 1 + 5 精彩帖子
eijuhz + 1 + 2 热心帮助其他会员

总评分: 学术水平 + 2  热心指数 + 7   查看全部评分

使用道具

需要滚动归集嘛?
exmple:

第一次比较:
001  1   2010/01/02
001  2   2010/05/12

第二次比较:
001  2   2010/05/12
001  1   2011/06/02

第三次比较:
001  1   2011/06/02
001  2   2011/10/12

使用道具

板凳
Rock2000 发表于 2017-7-15 21:12:46 |只看作者 |坛友微信交流群
大片阳光因你 发表于 2017-7-15 12:16
需要滚动归集嘛?
exmple:
要的,其实cish=1与cish=2是一组,其相差时间应该小于365天的,现在想判断同样ID内第1组的cish=2与第2组的cish=1之间相差的时间,如果相差时间>365天的,ID相同的记录均归于数据集A,否则归于数据集(B如ID=002的4条记录),分多次比较都可以。

使用道具

报纸
Rock2000 发表于 2017-7-16 13:15:11 |只看作者 |坛友微信交流群
大片阳光因你 发表于 2017-7-15 12:16
需要滚动归集嘛?
exmple:
其实,可以生产一个时间变量比如time,time的值是相同ID内按cishu由小到大排序后循环相减的得到,在这里,ID=001的第一条记录的time没有数字,第二、第三、第四条记录的time值分别是第二减第一、第三减第二、第四减第三的结果,然后判断time是否大于365,有归A数据集,这怎样实现?

使用道具

地板
Rock2000 发表于 2017-7-17 16:33:56 |只看作者 |坛友微信交流群
albusdzx 发表于 2017-7-14 16:49
想了个不是很简便的办法 抛砖引玉
data test;
input ID $  cish  date yymmdd10.;
谢谢,就是想要这效果。

使用道具

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

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

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

GMT+8, 2024-4-28 12:55