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

72
9

У меня есть таблица с doctor_id, Claim_date (тип даты), Claim_date_mo_id (тип char) и patient_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).

Примечание. Я должен принимать максимальное количество пациентов в течение любого периода.
Один из сценариев - месяц_ид 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

спросил(а) 2018-09-12T11:33:00+03:00 2 года, 2 месяца назад
1
Решение
58

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

ответил(а) 2018-09-12T12:43:00+03:00 2 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема