楼主: jungsee
6423 13

删除指定条件的数据 [推广有奖]

  • 0关注
  • 10粉丝

已卖:857份资源

讲师

31%

还不是VIP/贵宾

-

威望
0
论坛币
2094 个
通用积分
76.6887
学术水平
12 点
热心指数
15 点
信用等级
8 点
经验
75593 点
帖子
255
精华
0
在线时间
637 小时
注册时间
2004-12-20
最后登录
2025-10-16

楼主
jungsee 发表于 2014-3-27 12:05:50 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我的问题是这样的:每个 id 在一年中始终对应 4个 target, 我整理数据的规则是:如果 一个(id +target)在前面的year(不一定是连续的年度,只要是之前的年份就行)中,invest的值出现过 value=1, 那么这条数据就要删除。e.g 记录(1 b 2004 1)出现了,那么记录(1 b 2005 0)就要删除掉。
谢谢大神的指教!!!

示例的数据集:

data a;
input id target $ year invest;
cards;
1 a 2004 0
1 b 2004 1
1 c 2004 0
1 d 2004 1
1 a 2005 0
1 b 2005 0
1 c 2005 1
1 d 2005 0
2 a 2007 1
2 b 2007 1
2 c 2007 0
2 d 2007 0
2 a 2009 0
2 b 2009 0
2 c 2009 0
2 d 2009 1
;
run;

二维码

扫码加我 拉你入群

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

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

关键词:Target Invest Input value cards invest target 记录

回帖推荐

pobel 发表于2楼  查看完整内容

data b; if 0 then set a; if _n_=1 then do; declare hash h(); h.definekey('id','target'); h.definedata('id','target'); h.definedone(); end; set a; if h.find()=0 then delete; if invest=1 then h.add(); run;

沙发
pobel 在职认证  发表于 2014-3-27 12:53:11
data b;
   if 0 then set a;
   if _n_=1 then do;
             declare hash h();
            h.definekey('id','target');
                h.definedata('id','target');
                h.definedone();
        end;
        set a;
        if h.find()=0 then delete;
        if invest=1 then h.add();
run;
和谐拯救危机

藤椅
jungsee 发表于 2014-3-27 12:59:54
pobel 发表于 2014-3-27 12:53
data b;
   if 0 then set a;
   if _n_=1 then do;
谢谢大神的指点,可以运行!

板凳
466046020 发表于 2014-3-27 13:04:22
Another way:
data a;
input id target $ year invest;
cards;
1 a 2004 0
1 b 2004 1
1 c 2004 0
1 d 2004 1
1 a 2005 0
1 b 2005 0
1 c 2005 1
1 d 2005 0
2 a 2007 1
2 b 2007 1
2 c 2007 0
2 d 2007 0
2 a 2009 0
2 b 2009 0
2 c 2009 0
2 d 2009 1
;
run;

proc sort data=a;
        by id target year;
run;

data b;
        set a;
        by id target;
        retain tp_year tp_flag;
        if first.target then do;
                tp_flag=0;
                tp_year=0;
        end;
        if invest=1 then do;
                tp_flag=1;
                tp_year=year;
        end;
        if tp_flag=1 and tp_year ne year then delete;
        drop tp_:;
run;

报纸
jungsee 发表于 2014-3-27 13:49:06
466046020 发表于 2014-3-27 13:04
Another way:
data a;
input id target $ year invest;
这个解决方案也很赞!!!同样谢谢您

地板
z_shousi 发表于 2014-3-27 15:04:36
  1. proc sql;
  2. create table test as
  3. select id,target,year,invest
  4. from oralib.a t where (not exists (
  5. select 1 from oralib.a s where t.id = s.id
  6. and t.target = s.target and s.invest=1
  7. )
  8. or t.invest = 1
  9. );
  10. quit;
复制代码

7
jungsee 发表于 2014-3-27 15:20:22
z_shousi 发表于 2014-3-27 15:04
这个code,我运行不出我要的结果,您再看看。谢谢,辛苦了!!!

8
z_shousi 发表于 2014-3-27 15:24:35
jungsee 发表于 2014-3-27 15:20
这个code,我运行不出我要的结果,您再看看。谢谢,辛苦了!!!
报错了没?
还是数据返回不正确?

9
jungsee 发表于 2014-3-27 15:43:36
z_shousi 发表于 2014-3-27 15:24
报错了没?
还是数据返回不正确?
是报错

10
z_shousi 发表于 2014-3-27 15:47:22
jungsee 发表于 2014-3-27 15:43
是报错
proc sql;
create table test as
select id,target,year,invest
from oralib.a t where (not exists (
select 1 from oralib.a s where t.id = s.id
and t.target = s.target and s.invest=1
)
or t.invest = 1
);
quit;

红色的部分为你需要替换的表。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-8 16:58