Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在12个月的滚动期内,每个医生每月的不同患者数(从当前月份开始回顾11个月)_Sql_Teradata - Fatal编程技术网

Sql 在12个月的滚动期内,每个医生每月的不同患者数(从当前月份开始回顾11个月)

Sql 在12个月的滚动期内,每个医生每月的不同患者数(从当前月份开始回顾11个月),sql,teradata,Sql,Teradata,我有一个包含医生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/

我有一个包含医生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

注意:我必须取任何时期的最大不同患者数。 一种情况是针对2017年4月11日,过去11个月(不包括2017年4月的当前月份)的不同患者计数为2,但对于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  

我不知道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
嗯,,
设置

我会忽略CalimaDATEYMOYID,并考虑使用TrunCulaMyDATE“YYYYMM”。然后看看如何使用COUNTDISTINCT窗口聚合,该聚合使用ADD_monthClaim_date,-11和当前行之间的行定义窗口,并根据医生id进行分区。我认为还有一些其他挑战,因为您在事实表中的索赔日期驱动组,并且可能存在医生没有索赔的间隙。无论如何,我希望这有助于为您指明解决方案的方向。@Robballer感谢您的建议。但是countdistinct不适用于over。我忘了这一点感谢您的查询,但这无法获取所需的结果。很遗憾,它生成了不正确的结果,以什么方式不正确?无论如何,我已经编辑了我的答案,并给出了另一个建议。我尝试将其转换为Teradata等价物:选择CTE.DOCTOR_ID,CTE.CLAIM_DATE_MO_ID,CTE.LOOKBACK_12M,COUNTDISTINCT T.PATIENT_ID,从SELECT DISTINCT DOCTOR_ID,CLAIM_DATE_MO__ID,将日期格式为“YYYYMMDD”-间隔为“11”个月,“YYYYMM”从MyTable中回溯12M,其中医生ID=22222 CTE在CTE上加入MyTable T。医生ID=T。医生ID和CTE.CLAIM\U日期ID=T。医生ID=T。索赔日期\U MO ID=T。医生ID组1,2但是它返回0。我稍微改变了条件,现在它工作得非常好。和CTE.CLAIM\u DATE\u MO\u ID>=T.CLAIM\u DATE\u MO\u ID和CTE.LOOKBACK\u 12M当然,LOOKBACK\u 12M应该在您检查的日期之前。很高兴你解决了我的愚蠢错误!我已经更正了我的答案