【问题标题】:Calculate Continuous Enrollment 12 months before and after reference date计算参考日期前后 12 个月的连续入学人数
【发布时间】:2015-07-10 01:52:38
【问题描述】:

我是索赔数据的新手,对 SQL 也比较陌生...非常感谢您的帮助。

我有类似这样的数据:

Customer    Group   Member  ServiceDt
ABCDE       123     1111    01-Jan-12
            123     1111    01-Feb-12
            123     1111    01-Mar-12
            123     1112    01-Feb-12
            123     1112    01-Mar-12
FGHIJ       456     1116    01-Feb-12
KLMNO       567     1117    01-Mar-12
            678     1118    01-Feb-12
            789     1119    01-Mar-12

会员每月可以有一个条目来指示有效注册日期。因此,一个会员可以有 24 行,用于两年的注册。另一个可能只有五行,依此类推……每个成员都是一个组的一部分,而组又是一个客户的一部分。 (一个客户可以有多个组 - 每个组中有许多成员,每个成员每月有一行)。

我需要评估从服务日期前 12 个月到前 12 个月(服务日期前后一年的注册)的连续注册,然后按 CUSTOMER 和 GROUP 编号将其汇总到组中。

我尝试过 intck/intcx 函数,但似乎做错了什么。当我尝试第一个。最后。方式,我迷路了。这些数据对我来说太新鲜了。:)

这是我目前尝试的代码的 sn-ps(不包括服务器连接的东西):

beg1ylag = intnx('month',&eff ,-12,'m');
add1yfut = intnx('month',&eff , 12,'m');

If first.member_id then do;
    mth_cnt     = 0;
    lag_mth_cnt = 0;
    fut_mth_cn  = 0;
End;

 mth_cnt+1;
  if eff_dt < servicedt then lag_mth_cnt+1;
  if eff_dt > servicedt then fut_mth_cnt+1;

  if last.member_id then output;


Proc SQL;
Select (x,y,z

 beg1ylag = intnx('month',servicedt,-12,'m');
 add1yfut = intnx('month',servicedt, 12,'m');

call symput('_beg1ylag',cats("'",year(beg1ylag),'-',put(month(beg1ylag),z2.),"Middle'"));
call symput('_add1yfut',cats("'",year(add1yfut),'-',put(month(add1yfut),z2.),"Middle'"));
Quit;

我得到的结果是空行。我不知道我在做什么或做错了什么......请指导我。另外,请注意,服务不是固定的。每个成员都可以有一个不同的成员 - 正如您在上面看到的。最终,如果他们在 servicedt 周围有 24 个月的连续会员资格,我需要能够选择成员并按他们的组号对他们进行分组。

【问题讨论】:

  • 您介意提供预期的输出吗?
  • 请提供您的输入数据表的详细信息。请准确了解过去和未来 12 个月的规则。您正在处理哪种类型的医疗保健索赔,这种保险在美国有吗?您给出的要求对于健康保险来说似乎极其简单,而且可能涉及的因素和情况很多。未来 12 个月的覆盖范围的业务原因是什么?这些要求是什么?
  • 你的宏变量&amp;eff来自哪里?您是否正在寻找从某个日期之前的 12 个月到之后的 12 个月连续注册的会员? (那是 25 个月,而不是 24 个月!)除非您涉及大数据,否则为什么要添加 [ds2] 标签?你为什么将你的问题标记为[连续]?它与这个统计概念无关。
  • @yukclam9:一会儿我会整理一张桌子。感谢您的宝贵时间。
  • @WarrenT:当前表格与美国医疗保险系统中的注册相关。还有其他几个要求,但出于分析的目的,我被困在这里,但已经解决了我需要的查询的其他部分。商业客户想要一些趋势摘要,需要我比较之前和之后。关于12个月,他们坚持前12个月和未来12个月不间断覆盖。感谢您的宝贵时间。

标签: sql date db2 sas continuous


【解决方案1】:

如果我能很好地解释你的问题,你需要

%let eff = '01Feb2012'd;
%let span = 12;

Title "Members enrolled continuously from &span months before &eff till &span months after &eff";
proc sql;
    select Customer, Group, Member
    from   enrol
    where  ServiceDt between intnx('month',&eff ,-&span,'b') and intnx('month',&eff ,+&span,'b')
    group by Customer, Group, Member
    having count(*) EQ 1 + INTCK('month', intnx('month',&eff ,-&span,'b'), intnx('month',&eff ,+&span,'b'));
quit;

请注意,您应该使用 intnx 和 'b' 作为开始,而不是使用 'm' 作为中间,因为您的数据也提到了月份日期的开始。

【讨论】:

  • 谢谢@DirkHosten。我会尝试这个建议并更新小组。我对'm'表示歉意。我正在为董事会输入一个虚拟列表并且没有考虑 - 与开始日期一起。在我的数据中,日期始终是每月 15 日,因此我使用了“m”。
  • 其实having子句最好写成count(*) EQ %eval(1 + 2 * &amp;span)
【解决方案2】:

如果您的源数据在 SAS 数据集中,并且您可以在数据所在的服务器上运行 SAS 代码,则以下方法非常有效。

%let span = 12;

Data Continuous (keep=Customer Group Member eff);
    set Service;
    by Customer Group Member ServiceDt;

** 对于每个新成员或服务中断 开始一个新的连续服务间隔**;

    retain From;
    if first.Member or dif(ServiceDt) GT 31 
        then From = ServiceDt;

** 如果服务至少在 2 个月前开始 然后跨月前是中心 足够长的连续服务间隔**;

    if INTCK('month', From, ServiceDt) GE %eval(2 * &span) then do;
        eff = intnx('month', ServiceDt,-&span,'b');
        output;
    end;
run;

它会同时为您提供每个可能的服务间隔中心 (=eff) 的结果。

【讨论】:

  • 感谢您抽出宝贵时间输入@Dirk Horstern。是的,我的来源是一个 SAS 数据文件。我今天将尝试此代码并更新电路板。因为还有其他问题要处理,所以我不能早点这样做。
猜你喜欢
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多