【问题标题】:count of distinct patients per doctor per month for a rolling period of 12 month(11 months look back from the current month)在 12 个月的滚动期内(从当月回溯 11 个月)每月每位医生的不同患者数
【发布时间】:2019-02-16 20:07:51
【问题描述】:

我有一张表,其中包含医生 ID、声明日期(日期类型)、声明日期 Mo_id(字符类型)和患者 ID。 一位医生的样本数据集如下所示:

**DOCTOR_ID**   **CLAIM_DATE**  **CLAIM_DATE_MO_ID**    **PATIENT_ID**  
22222         7/29/2015       201507        12769998  
22222         9/29/2015       201509        12769998  
22222         9/7/2016        201609        756850  
22222         10/6/2016       201610        756850  
22222         4/11/2017       201704        837125  
22222         4/11/2017       201704        837125  
22222         4/11/2017       201704        837125  
22222         4/13/2017       201704        892834  
22222         5/15/2017       201705        837125  
22222         5/15/2017       201705        837125  
22222         5/15/2017       201705        837125  
22222         7/6/2017        201707        892834  
22222         9/6/2017        201709        17539987  
22222         9/19/2017       201709        837125  
22222         10/3/2017       201710        756850  
22222         10/3/2017       201710        756850  
22222         10/9/2017       201710        17539987  

输出应该如下:

**DOCTOR_ID**   **CLAIM_DATE_MO_ID**    **count(distinct patient)**  
22222             201507              1  
22222             201509              1  
22222             201609              1  
22222             201610              1  
22222             201704              3  
22222             201705              3  
22222             201707              3  
22222             201709              4  
22222             201710              4  

计数是从当月到过去 11 个月期间医生看到的不同患者的数量。 例如 201507 表示期间(201507-201408)。

注意:我必须在任何时期取不同患者人数的最大值。
一种情况是 month_id 201704,其中过去 11 个月(不包括 201704 的当前月份)的不同患者计数为 2 到 4 月 11 日,但对于 4 月 13 日,不同患者的计数变为 3,这将被捕获。
所以对于 201704,计数应该是 3。

我尝试了以下查询,但没有得到所需的输出。

sel doctor_id,case when to_number(claim_date_mo_id)-lookback_12m is not null then claim_date_mo_id||lookback_12m end,count(distinct patient_id)  
from  
(  
sel doctor_id,patient_id,claim_date_mo_id ,
to_number(to_char(cast(trim(claim_date_mo_id)||'01' as date format'YYYYMMDD') - interval '11' month 'YYYYMM')) as lookback_12m  
from table  
where doctor_id=22222  
) A  
group by 1,2  

【问题讨论】:

  • 我会忽略 claim_date_mo_id 并考虑使用 TRUNC(claim_date, 'yyyymm')。然后查看使用 COUNT(DISTINCT) 窗口聚合,该聚合使用 ROWS BETWEEN ADD_MONTHS(claim_date, -11) 和 CURRENT ROW 定义一个窗口,并在医生 ID 上进行分区。我认为还有一些其他挑战,因为您要在事实表中的索赔日期之前推动该小组,并且可能存在医生没有索赔的空白。无论如何,我希望这有助于为您指明解决方案的方向。
  • @RobPaller 谢谢你的建议。但是 count(distinct) 不适用于 over() 。
  • 好点我忘记了。 :(

标签: sql teradata


【解决方案1】:

我不了解 Teradata,所以我会按照我最熟悉的(Firebird)来回答。怎么样

    select a.doctor_id,
           cast( cast( substring( a.claim_date_mo_id from 1 for 4 ) as integer ) - 1 as char( 4 ) ) || substring( a.claim_date_mo_id from 5 for 2 ) || '-' || a.claim_date_mo_id claim_period,
           count( distinct b.patient_id ) distinct_patients
    from table a
    join table b on a.doctor_id = b.doctor_id 
           and b.claim_date_mo_id > cast( cast( substring( a.claim_date_mo_id from 1 for 4 ) as integer ) - 1 as char( 4 ) ) || substring( a.claim_date_mo_id from 5 for 2 )
           and b.claim_date_mo_id <= a.claim_date_mo_id
    where a.doctor_id = 22222
    group by 1,2

这里有一个替代方案:

    WITH MyCTE( DOCTOR_ID, CLAIM_DATE_MO_ID, LOOKBACK_12M ) AS
    ( SELECT DISTINCT DOCTOR_ID, CLAIM_DATE_MO_ID, 
                      to_number(to_char(cast(trim(claim_date_mo_id)||'01' as date format'YYYYMMDD') - interval '11' month 'YYYYMM')) 
      FROM MyTable 
      WHERE DOCTOR_ID = 22222 )
    SELECT CTE.DOCTOR_ID, CTE.CLAIM_DATE_MO_ID || CTE.LOOKBACK_12M, COUNT(DISTINCT T.PATIENT_ID
    FROM MyCTE CTE
    JOIN MyTable T ON CTE.DOCTOR_ID = T.DOCTOR_ID
                  AND T.CLAIM_DATE_MO_ID >= CTE.LOOKBACK_12M
                  AND T.CLAIM_DATE_MO_ID <= CTE.CLAIM_DATE_MO_ID 
    GROUP BY 1, 2

HTH, 设置

【讨论】:

  • 感谢您的查询,但这并没有获取所需的结果。
  • 很遗憾听到它产生了不正确的结果,它以什么方式不正确?无论如何,我已经编辑了我的答案并给出了一个替代建议。
  • 我尝试将其转换为等效的 Teradata:SELECT CTE.DOCTOR_ID, CTE.CLAIM_DATE_MO_ID || CTE.LOOKBACK_12M, COUNT(DISTINCT T.PATIENT_ID) FROM ( SELECT DISTINCT DOCTOR_ID, CLAIM_DATE_MO_ID, TO_NUMBER(TO_CHAR(CAST(TRIM(CLAIM_DATE_MO_ID) || '01' AS DATE FORMAT 'YYYYMMDD') - INTERVAL '11' MONTH, 'YYYYMM') ) LOOKBACK_12M FROM MyTable WHERE DOCTOR_ID = 22222 ) CTE JOIN MyTable T ON CTE.DOCTOR_ID = T.DOCTOR_ID AND CTE.CLAIM_DATE_MO_ID &lt;= T.CLAIM_DATE_MO_ID AND CTE.LOOKBACK_12M &gt;= T.CLAIM_DATE_MO_ID GROUP BY 1, 2 但它返回 0 行
  • 我稍微改变了条件,现在它工作得很好。 AND CTE.CLAIM_DATE_MO_ID >= T.CLAIM_DATE_MO_ID AND CTE.LOOKBACK_12M
  • 当然lookback_12m 应该在您检查的日期之前。很高兴你解决了我的愚蠢错误!我已经更正了我的答案
猜你喜欢
  • 2019-01-04
  • 2019-12-03
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多