楼主: reduce_fat
994 12

[程序分享] 悬赏 SAS 会员注册服务月数统计总结问题,谢谢。 [推广有奖]

荣誉版主

海外论坛首席管理员

已卖:18511份资源

泰斗

28%

还不是VIP/贵宾

-

TA的文库  其他...

海外原创经济论文和写作技巧

威望
11
论坛币
3591317 个
通用积分
34055.2893
学术水平
6834 点
热心指数
7193 点
信用等级
6665 点
经验
1830 点
帖子
12424
精华
78
在线时间
1974 小时
注册时间
2011-6-13
最后登录
2025-10-23

一级伯乐勋章 初级热心勋章 初级学术勋章 中级热心勋章 中级学术勋章 高级学术勋章 初级信用勋章 特级学术勋章 高级热心勋章 中级信用勋章 特级热心勋章 高级信用勋章 特级信用勋章

楼主
reduce_fat 发表于 2025-2-11 11:34:30 |AI写论文
77论坛币
这里有个新问题,楼主想向论坛大牛请教一下,具体看样本数据在附件里: Sample Data.xlsx (10.83 KB)
这个问题要是没有注册连续性的说明其实不是很难,但是加上连续性要求后,每个人的情况不一样不知道怎么一次性总结出来。

变量:ID 就是人的代号和身份证一样是每个人独有的。

Service_Start_Date 就是服务开始日期,这个要求计算从每个人服务开始日的前10个月(算平均30天一个月), 和服务开始后的8个月分别计算他们的注册月数。比如一个人要是2020年11月1日开始的服务,注册开始月份是2019年1月,终结月份是2021年12月,中间没有中断过注册。那么这个人很好计算,前十个月的注册月数就是10, 后8个月的注册月数就是8。

但是如果他在2021年2月底中断服务直到2021年4月底,那么不影响前十个月的注册月数计算还是10,但是后8个月的计算就是2020年11月初到2021年2月底 (4个月),然后再算2021年5月初到2021年6月底 (2个月),也就是总共6个注册月数而不是8了。
还有就是如果一个 ID 的 ID_Start_Date就是注册开始月份少于服务开始日期的十个月范围,那么就按实际月数计算。比如一个人的ID_start_date 是2020年3月9日,但是Service_start_date是2020年11月1日。那么很明显这个人的注册月数在服务开始前是不满十个月的,那就按照实际情况计算就是 2020年3月9日到2020年11月1日,就是用之间的天数之和除以30得出实际注册月数即可。 对于服务开始之后的8个月不足的情况,也用类似方法计算实际的注册月数即可。

这只是样本数据,总数居有几十万行,所以需要一次性总结出各种中断情况才行。金币不是问题。  谢谢。



最佳答案

如风飘扬 查看完整内容

这个问题是真的不会哈哈哈哈,我只会一些最简单的过程步,平时都是用的数据步+简单过程步来实现目的的,比如说写写总结之类的。不用给我送金币啦,我用不上的。我单纯好奇、想研究一下这个问题,专门开个vip来下载你的附件,看看能不能研究出点什么的。
关键词:service Start 样本数据 STAR date
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999

沙发
如风飘扬 发表于 2025-2-11 11:34:31
reduce_fat 发表于 2025-3-13 14:38
我这里还有些额外的金币,也没人解答,你去回复一下,这些金币送给你了。 https://bbs.pinggu.org/thread ...
这个问题是真的不会哈哈哈哈,我只会一些最简单的过程步,平时都是用的数据步+简单过程步来实现目的的,比如说写写总结之类的。不用给我送金币啦,我用不上的。我单纯好奇、想研究一下这个问题,专门开个vip来下载你的附件,看看能不能研究出点什么的。

藤椅
reduce_fat 发表于 2025-2-13 01:27:50
我举个简单的例子,那个服务就假设成国内流行的甲流。 你把其中一个ID想象成断交医保的人就可以。那个ID Start Date 相当于医保开始交的时间,ID End Date 相当于医保断交时间。如果一个人有多个ID Start Date 和 ID End Date,那么就是医保断交了不连续的情况。 医保断交的月数是不能算在最后需要统计的医保的参保的月数里面的。 这是要统计第一次感染甲流的人,感染前10个月和感染后8个月参加医保的月数。 不连续没关系,只是得把中间交医保的月数去掉即可。 谢谢。

板凳
reduce_fat 发表于 2025-3-4 13:23:14
寻找热心大牛解答。
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999

报纸
如风飘扬 发表于 2025-3-8 01:44:40
菜鸟一个,不太懂具体是想怎么样,但是按照我的理解稍微说一下我的想法,有误的地方尽请谅解!
以下的说法全部基于我的理解:ID_Start_Date是注册时间,Service_Start_Date是服务开始时间,ID_End_Date是结束服务的时间。“计算从每个人服务开始日的前10个月”是Service_Start_Date-ID_Start_Date;“服务开始后的8个月”是ID_End_Date-Service_Start_Date。
假如你的数据是纵向的,比如第一行记录001在xxxx-xx-xx注册,在xxxx-xx-xx使用,在xxxx-xx-xx结束;第二行记录001在xxxx-xx-xx注册,在xxxx-xx-xx重新使用,在xxxx-xx-xx再次结束;第三行以此类推...这种类型的数据,直接算每一行的结果再加起来就可以了吧,如果≥10/8的数据就是10/8,如果小于10/8的数据就等于计算出来的数据。
假如你的数据是像excel里一样的,中断使用的信息是记录Registration Notes的话,存在一种情况,可能不止中断使用一次,但假设每次记录的信息格式都是一样的(如:ID 001 ended on 7/26/2018 but resumed on 7/1/2019 through 10/22/2019; ID 001 ended on 3/9/2020 but resumed on 5/1/2020 through 6/25/2020; ...),那或许可以通过正则表达式提取相关的日期,再通过转置处理成纵向数据,然后就如上所说。

如果你能提供更详细的信息和例子,包括变量的计算公式,最后得到的结果等,或许我可以给你一个更详细的答复。

地板
reduce_fat 发表于 2025-3-9 23:12:54
如风飘扬 发表于 2025-3-8 01:44
菜鸟一个,不太懂具体是想怎么样,但是按照我的理解稍微说一下我的想法,有误的地方尽请谅解!
以下的说法 ...
能否把SAS代码写出来看看? 这个结果还是得放到Excel 里总结的不是横向而是纵向的。我不怎么会写那种loop array之类的所以跑起来比较慢。

7
如风飘扬 发表于 2025-3-10 22:24:37
再次说明,这是我根据自己的理解写的小小代码,如果与您的需求不符,敬请谅解哦~因为实在太简单,所以怀疑我应该是没理解到您的意思,但相必也能作为一点参考:

* 手动将excel的数据整理成纵向的了;
data test1;
        input ID $ Service_Start_Date ID_Start_Date ID_End_Date @@;
        informat ID_Start_Date Service_Start_Date ID_End_Date yymmdd10.;
        format ID_Start_Date Service_Start_Date ID_End_Date yymmdd10.;
        cards;
                001        2018-07-04        2017-04-15        2018-07-26
                001        2019-07-01        2017-04-16        2019-10-22
                002        2019-04-09        2018-03-11        2018-12-01
                002        2019-03-01        2018-03-12        2020-04-21
                003        2021-04-02        2019-03-17        2022-04-30
                004        2022-05-03        2021-03-23        2024-12-31
                005        2019-01-02        2018-11-05        2020-03-09
                005        2020-05-01        2018-11-06        2020-06-25
                006        2023-11-05        2022-08-04        2024-09-25
                007        2020-06-04        2019-04-05        2024-12-31
                008        2021-04-02        2019-01-15        2024-12-31
                009        2021-04-19        2020-01-09        2023-04-21
                010        2021-05-02        2019-06-04        2022-01-30
                010        2022-05-01        2019-06-05        2022-08-06
                011        2022-05-31        2021-02-15        2022-03-25
                011        2022-05-01        2021-02-16        2023-04-11
                012        2021-01-05        2019-10-07        2023-05-30
                013        2022-09-16        2021-07-25        2024-12-31
                014        2023-10-25        2022-03-08        2024-09-15
                015        2020-04-08        2019-01-23        2022-11-30
        ;
run;


* 根据理解简单计算的两个月数;
* 可能是测试数据有问题,也可能是我的理解有问题,造成部分月数<0,所以这里将<0的数据设置为0;
data test2;
        set test1;
        start_date=(Service_Start_Date-ID_Start_Date)/30;
        end_date=(ID_End_Date-Service_Start_Date)/30;
        if start_date<0 then start_date=0;
        if end_date<0 then end_date=0;
run;


* 用sql计算求和,floor() 将不足一个月的也当成一个月;
proc sql noprint;
        create table test3 as
        select distinct ID, floor(sum(start_date)) as A_start_date, floor(sum(end_date)) as A_end_date
        from test2
        group by id
        ;
quit;


* 大于10/8的设置为10/8,小于等于10/8的则等于原先的结果;
data test4;
        set test3;
        if A_start_date>10 then A_start_date=10;
        if A_end_date>8 then A_end_date=8;
run;



8
reduce_fat 发表于 2025-3-11 14:53:25
如风飘扬 发表于 2025-3-10 22:24
再次说明,这是我根据自己的理解写的小小代码,如果与您的需求不符,敬请谅解哦~因为实在太简单,所以怀疑我 ...
谢谢帮助,我自己在Excel 里弄出来了,由于时间比较紧迫,我在做这个项目时候,也是用类似的方法先把数据处理缩小一下但是好在多数人没有中断服务那种情况,所以比较好统计,然后从SAS里导出后在Excel 里完成剩余步骤。 但是这种类似的问题以后也会遇到,如果数据很大比如几个GB 的那种,就需要用SAS处理完大多数步骤后再导出到Excel里,要不然Excel 会直接崩溃的。

9
reduce_fat 发表于 2025-3-11 15:13:30
如风飘扬 发表于 2025-3-10 22:24
再次说明,这是我根据自己的理解写的小小代码,如果与您的需求不符,敬请谅解哦~因为实在太简单,所以怀疑我 ...
你可以把ID start date 当作一个人医保缴纳的开始日期,ID end date 当作这个人医保缴纳的中止日期,Service start date 是一个人使用医保看病的日期。 这一个人可以在医保缴纳时间内看多次病。 而且和国内不同的是,这个人可以在一年里因为财务状况或者其他不可抗因素断交医保一段时间然后再需要。需要指出的是,如果这个人再医保断交时间段里去看病的话,医保是可以不支付其医药费的。以后续交后再看病的时候才会报销以后看病的医药费。 我要研究的是每个人是否只是在知道自己快要生大病的时候才去提前一两月买医保,如果不是慢性病或者比较快可以治愈后,是否还会一直续交医保。 这样的话,你就该理解那些数据为什么比较怪了。

但是比较麻烦的是有的人不连续交医保,这样的话,你需要考虑这个人断交医保的时间是否发生在他看病前10个月或者看病后8个月之内。这个10和8 可以随便换成其他月数也没关系。 比如一个人开始交医保的日期是2018年5月10日,他因为财务状况原因于2019年2月初断交医保三个月到4月底,但是在2019年5月后一直续交医保至今。 他得了阑尾炎住院手术发生在2019年10月初,那么计算这个人看病前10个月的医保缴纳月数就是 2019 年10月初到2018年12月初是10个月,但是他在2019年断交医保的三个月也在这段时间里,所以要把这三个月减去才可以,最终就是看病前交医保月数是 7,但是看病后他一直续交医保至今所以交医保月数就是 8 个月很好算。 但不是每个人都是这样的,如果他做完手术出院五个月后不再交医保了,那么这个人看病后的医保缴纳月数就会是 5 而不是 8。

说了这么多,你明白我的意思了吗?

10
如风飘扬 发表于 2025-3-12 23:44:31
reduce_fat 发表于 2025-3-11 15:13
你可以把ID start date 当作一个人医保缴纳的开始日期,ID end date 当作这个人医保缴纳的中止日期,Serv ...
我应该是懂你的意思了,我先对横向数据做了一个分析,也写了代码稍作测试(当然细节肯定是需要调整的),您看看结果是否符合您的要求。至于纵向数据,时间太晚了就等下次研究吧。

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

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