楼主: dc1015
2601 2

请教:查询连续3天及以上的数据 [推广有奖]

  • 0关注
  • 1粉丝

已卖:378份资源

本科生

22%

还不是VIP/贵宾

-

威望
0
论坛币
226 个
通用积分
0.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
289 点
帖子
21
精华
0
在线时间
131 小时
注册时间
2012-8-13
最后登录
2025-9-9

楼主
dc1015 发表于 2015-4-14 23:08:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data tm;
  length id $ 12;
  input date:yymmdd10. id $ name $ @@;
cards;
2012-5-31        PID000100282        马梅
2012-6-1        PID000100282        马梅
2012-6-2        PID000100282        马梅
2014-7-15        PID000100445        朱文
2012-10-30        PID000101056        骆超
2013-3-30        PID000101493        许荣
2013-4-6        PID000101493        许荣
2013-4-8        PID000101493        许荣
2013-4-9        PID000101493        许荣
;
run;

*查询连续3天及以上的数据;
proc sort data=tm;
  by id date;
run;
data over3;
  set tm;
  by id date;
    y=dif(date);
      if first.id then do;
          x=0; end;
        else x=dif(date);
*format date yymmdd10.;
run;
proc print;
run;
/***********
我的思路是,按id分组
在组内第一个观测x=0,组内第二个观测x=第一个date-第二个date
通过x的值是不是=1 来判断数据是否连续
不明白为什么,y=dif(date)正常,x=dif(date)无效???

此外,请问解决这种连续日期问题的算法,越多越好!谢谢
***********/


二维码

扫码加我 拉你入群

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

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

关键词:length format cards print Input

沙发
losttemple 发表于 2015-4-15 10:17:35
dif函数和if/else语句一起使用的话有些tricky。你可以搜搜相关文章,在没搞清楚原理前,尽量不要这样用。

藤椅
dc1015 发表于 2015-4-15 22:14:34
找了一些资料,发现lag函数的运行机制大概是这样:
1.lag(x)是一个队列(queue)函数,每次执行,从队列的起始读取数值并将该值移除出队列,队列中的剩余值上移,x的当前值进入队列末尾。因此首次执行后,lag(x)值为missing,队列中只有1个值--即x的当前值。

2.只有当lag(x)被执行后,x的当前值才会被读入队列中。因此,如果使用条件语句,不符合条件时,lag(x)不被执行,当前的x值也不会进入队列,从而不会出现在lag(x)的结果中。

3.尽量不要在中间使用if语句跳过lag(x),这样会使结果不容易控制(系统会顺延一个值,然后跳过值,如示例中z6所示)。

4.SAS语句内的lag函数是无关的,即使执行的是同样的lag(x)。(如示例中多个lag(x)的结果互补相关)

5.不要试图用b=lag(b)+x来进行累积运算,用b+x代替。

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

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