楼主: wdxmahone
9841 9

sql 如何实现 sas中 retain 的功效 [推广有奖]

  • 0关注
  • 1粉丝

已卖:348份资源

硕士生

40%

还不是VIP/贵宾

-

威望
0
论坛币
12568 个
通用积分
0
学术水平
2 点
热心指数
3 点
信用等级
2 点
经验
3518 点
帖子
121
精华
0
在线时间
155 小时
注册时间
2010-1-11
最后登录
2022-9-4

楼主
wdxmahone 发表于 2011-7-14 11:08:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位高手好,我现在遇到一个问题,sql如何实现 sas中retain的功效。比如有这样一个数据集A;
X1 X2
01 10
01 .
01 .
01 20
01 .
02 100
02 .
02 120
02 .
02 140
02 .
;

把上面空的值都用上一个数替换,用sas的retain很方便,但是用SQL怎么实现啊。

谢谢大牛!
二维码

扫码加我 拉你入群

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

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

关键词:RETAIN 如何实现 ETA RET sql SAS sql RETAIN

回帖推荐

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

data a; input X1 $ X2; if ^missing(x2) then flag+1; cards; 01 10 01 . 01 . 01 20 01 . 02 100 02 . 02 120 02 . 02 140 02 . ; proc sql; create table b as select x1,max(x2) as x2 from a group by flag; quit; 也要借助其他变量。

本帖被以下文库推荐

沙发
soporaeternus 发表于 2011-7-14 12:13:06
  1. data b;
  2.         set a;
  3.         n+1;
  4. run;

  5. proc sql;
  6.         create table c as
  7.                 select
  8.                          a.X1
  9.                          ,c.X2
  10.                 from
  11.                 (select       
  12.                         a.n
  13.                         ,a.X1
  14.                         ,a.X2
  15.                         ,max(b.n) as n_min
  16.                 from b a
  17.                 left join
  18.                         b b
  19.                 on a.X1=b.X1
  20.                         and a.n>=b.n
  21.                         and b.X2^=.
  22.                 group by
  23.                         a.n
  24.                         ,a.X1
  25.                         ,a.X2
  26.                 )
  27.                 a
  28.                 left join
  29.                         b c
  30.                 on
  31.                         a.n_min=c.n
  32.                 order by
  33.                         a.n
  34.         ;
  35. quit;
复制代码
费劲啊,求简化
Let them be hard, but never unjust

藤椅
pobel 在职认证  发表于 2011-7-14 12:25:31
data a;
input X1 $  X2;
if ^missing(x2) then flag+1;
cards;
01 10
01 .
01 .
01 20
01 .
02 100
02 .
02 120
02 .
02 140
02 .
;

proc sql;
   create table b as
     select x1,max(x2) as x2
         from a
         group by flag;
quit;

也要借助其他变量。
已有 1 人评分热心指数 收起 理由
crackman + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

和谐拯救危机

板凳
wdxmahone 发表于 2011-7-14 13:33:46
3# pobel

您好,有几个问题,
1. 这里还是使用了SAS,我只想用SQL程序,用sql_server软件做,没法使用SAS程序;
2. 如果x2是字符型的应该怎么弄。

谢哈

报纸
soporaeternus 发表于 2011-7-14 13:40:25
思路是类似的
就是连接缺失值之前最近的一条非缺失值
和变量类型无关
Let them be hard, but never unjust

地板
wdxmahone 发表于 2011-7-14 14:18:49
5# soporaeternus
单用SQL怎么实现啊

7
soporaeternus 发表于 2011-7-14 14:20:16
类似于我的代码,就是之前给个自增id就可以了
Let them be hard, but never unjust

8
pobel 在职认证  发表于 2011-7-14 14:49:43
wdxmahone 发表于 2011-7-14 14:18
5# soporaeternus
单用SQL怎么实现啊
SQL 程序可以加一个自增变量:

PROC sql;
   create table b as
      select *,monotonic() as n
        from a;
quit;

之后步骤见2楼。
和谐拯救危机

9
pobel 在职认证  发表于 2011-7-14 15:26:42
data test;
   input X1 $ X2;
   cards;
01 10
01 .
01 .
01 20
01 .
02 100
02 .
02 120
02 .
02 140
02 .
;


proc sql;
    create table test1 as
          select x1, x2, monotonic() as n
          from test
      ;

   create table test2(keep=x1 x2) as
          select distinct l.x1,l.n,r.x2
             from test1 as l,
                          (select distinct x2,n as group from test1 where ^missing(x2))as r
       where l.n>=group
        group by n
        having group=max(group)
        order by n;
quit;
已有 1 人评分学术水平 收起 理由
crackman + 1 热心帮助其他会员

总评分: 学术水平 + 1   查看全部评分

和谐拯救危机

10
bobguy 发表于 2011-7-17 10:57:53
wdxmahone 发表于 2011-7-14 13:33
3# pobel

您好,有几个问题,
1. 这里还是使用了SAS,我只想用SQL程序,用sql_server软件做,没法使用SAS程序;
2. 如果x2是字符型的应该怎么弄。

谢哈
This query can solve your question 2).

data a;
input X1 $  X2;
if ^missing(x2) then flag+1;
cards;
01 10
01 .
01 .
01 20
01 .
02 100
02 .
02 120
02 .
02 140
02 .
;
proc sql;
   create table b as
     select t.x1,s.x2
         from a t
   left join
   (select x1, x2, flag
          from a
          where x2 ne . ) s
   on t.x1=s.x1 and t.flag=s.flag
         ;
quit;
proc print;run;

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

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