количество отдельных пациентов на одного врача в месяц в течение скользящего периода 12 месяцев (11 месяцев назад по сравнению с текущим месяцем) - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица с доктором_идентификацией, заявкой_даты (тип даты), заявкой_дата_mo_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 по 11 апреля, но за 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  

1 Ответ

0 голосов
/ 12 сентября 2018

Я не знаю 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, Set

...