Извлечь верхний процент идентификаторов из списка на основе другого процента CTE - PullRequest
0 голосов
/ 11 мая 2018

У меня есть CTE, указанный ниже, чтобы получить членство, а затем получить все заявки для этих участников (если у них было совпадение в параметрах даты), теперь из общего числа участников (= 1961) мне нужно получить ТОП.3% или 0,03 от претензий CTE.Я вижу, что 1961 * 0,03 округлено до 59, поэтому мне нужно вытащить верхние (59) идентификаторы Medicaid из претензий с наибольшей общей суммой использования претензий.

Так, например, в number_to_pull CTE, который указывает, какие строки необходимо добавить (это дает 3% членства), затем в sum_of_claims CTE. Я хочуТОЛЬКО получить 3% верхних идентификаторов Medicaid из претензий CTE .. Поскольку членство может меняться в зависимости от дат даты, я хочу, чтобы у sum_of_claims было что-то похожее на приведенное ниже, но яне знаю, с чего начать

Конечным результатом будет то, что у меня будет список (3%) идентификаторов Medicaid с наибольшим количеством обращений на одну заявку за указанный период времени

Мне нужно что-товот так, но я хочу, чтобы оно набирало любое число в number_to_pull CTE, а затем вытягивало это число на основе суммы требований.

Select Top ( select 
            round(count(mt.medicaid_no)*0.03) as percentt
      from membership mt)   

    cll.medicaid_no
   ,count(distinct claim_number) as sum_of_claims 

from claims cll

Group by cll.medicaid_no 

) select * from sum_of_claims

Вот чтомои коды на самом деле выглядят так:

WITH 

DATES AS 
(
select  TRUNC(TRUNC(SYSDATE,'y')-1,'y') as startdate,         
 TRUNC(SYSDATE,'y')-1 as enddate

 from dual

),

membership as  (
select Distinct
 mbr.medicaid_no
,mbd.memb_dim_id
,mbd.memb_demographics_full_date

from dw.fact_member_demographics mbd

    inner join dates d
      on 1=1

inner join dw.DIM_MEMBER mbr
on mbd.memb_dim_id = mbr.memb_dim_id  

Where EXTRACT(YEAR FROM mbd.memb_demographics_full_date)= extract(year from d.startdate)
and mbd.company_dim_id in ('575')
      and mbd.age > 18

) ---select * from membership

,number_to_pull as ( 

  select 
            round(count(mt.medicaid_no)*0.03) as percentt
      from membership mt     
)  ---select * from top_number

,Claims as (

select 
 mbdd.medicaid_no
,mbdd.memb_dim_id
,dc.company_desc
,cl.primary_svc_date
,cl.claim_number
,case when cl.io_flag_dim_id = '1' then 'Inpatient'
      when cl.io_flag_dim_id = '2' then 'Outpatient' else 'false' end as In_Op
,cl.admit_type
,proc.procedure_code
,dx1.diagnosis_code as dx1
,dx1.diagnosis_short_desc as dx1desc
,dx2.diagnosis_code as dx2
,dx2.diagnosis_short_desc as dx2desc
,dx3.diagnosis_code as dx3
,dx3.diagnosis_short_desc as dx3desc
,dx4.diagnosis_code as dx4
,dx4.diagnosis_short_desc as dx4desc
,dx5.diagnosis_code as dx5
,dx5.diagnosis_short_desc as dx5desc
,bt.inp_outp_ind 



from membership mbdd



left join dw.fact_claim  cl
on mbdd.memb_dim_id = cl.memb_dim_id


inner join dates d
 on 1=1


inner join dw.DIM_PROCEDURE_CODE  proc
 on cl.cpt_code_dim_id = proc.procedure_dim_id

inner join dw.DIM_DIAGNOSIS dx1
 on cl.diagnosis_1_dim_id = dx1.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx2
 on cl.diagnosis_2_dim_id = dx2.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx3
 on cl.diagnosis_3_dim_id = dx3.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx4
 on cl.diagnosis_4_dim_id = dx4.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx5
 on cl.diagnosis_5_dim_id  = dx5.diagnosis_dim_id 

inner join dw.DIM_BILL_TYPE bt
 on cl.bill_type_dim_id = bt.bill_type_dim_id

inner join dw.DIM_COMPANY dc
 on cl.company_dim_id = dc.company_dim_id


Where cl.primary_svc_date between d.startdate and d.enddate
and cl.company_dim_id in ('575')
and CL.WHOLE_CLAIM_STATUS_DIM_ID IN  (1,2) 
and cl.io_flag_dim_id in ('1','2')
) ---select * from  claims

,sum_of_claims AS ( 

Select   
            ---- this is where I want to pull in the top 3% based off of membeship and sum of claims per Medicaid 
    cll.medicaid_no
   ,count(distinct claim_number) as sum_of_claims 

from claims cll

Group by cll.medicaid_no 

) select * from sum_of_claims

Конечным результатом, который я хочу, является список идентификаторов Medicaid и общая сумма претензий, но этот список будет ТОЛЬКО из первых 59 строк (3%)

MEDICAID_NO   SUM_OF_CLAIMS
111111         $12,439.61 
333333         $5,315.57 
444444         $2,007.00 
555555         $1,823.98 
888888         $1,770.00 
777777         $1,211.47 
9999999        $1,157.61 
6666666        $1,068.76 

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Спасибо Дэвиду Ф. Мне удалось привлечь 3% лучших участников из претензий. Ниже мой код.

WITH 

DATES AS 
(
select  TRUNC(TRUNC(SYSDATE,'y')-1,'y') as startdate,         
 TRUNC(SYSDATE,'y')-1 as enddate

 from dual

),

membership as  (
select Distinct
 mbr.medicaid_no
,mbd.memb_dim_id
,mbd.memb_demographics_full_date



from dw.fact_member_demographics mbd


    inner join dates d
      on 1=1

 inner join dw.DIM_MEMBER mbr
  on mbd.memb_dim_id = mbr.memb_dim_id  

Where EXTRACT(YEAR FROM mbd.memb_demographics_full_date)= extract(year from d.startdate)
  and mbd.company_dim_id in ('575')
  and mbd.age > 18

) ---select * from membership

,Claims as (

select 
 mbdd.medicaid_no
,mbdd.memb_dim_id
,dc.company_desc
,cl.primary_svc_date
,cl.claim_number
,case when cl.io_flag_dim_id = '1' then 'Inpatient'
      when cl.io_flag_dim_id = '2' then 'Outpatient' else 'false' end as In_Op
,cl.admit_type
,proc.procedure_code
,dx1.diagnosis_code as dx1
,dx1.diagnosis_short_desc as dx1desc
,dx2.diagnosis_code as dx2
,dx2.diagnosis_short_desc as dx2desc
,dx3.diagnosis_code as dx3
,dx3.diagnosis_short_desc as dx3desc
,dx4.diagnosis_code as dx4
,dx4.diagnosis_short_desc as dx4desc
,dx5.diagnosis_code as dx5
,dx5.diagnosis_short_desc as dx5desc
,bt.inp_outp_ind
,cl.net_amt 



from membership mbdd


left join dw.fact_claim  cl
on mbdd.memb_dim_id = cl.memb_dim_id


inner join dates d
 on 1=1

inner join dw.DIM_PROCEDURE_CODE  proc
 on cl.cpt_code_dim_id = proc.procedure_dim_id


inner join dw.DIM_DIAGNOSIS dx1
 on cl.diagnosis_1_dim_id = dx1.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx2
 on cl.diagnosis_2_dim_id = dx2.diagnosis_dim_id 

inner join dw.DIM_DIAGNOSIS dx3
 on cl.diagnosis_3_dim_id = dx3.diagnosis_dim_id 


inner join dw.DIM_DIAGNOSIS dx4
 on cl.diagnosis_4_dim_id = dx4.diagnosis_dim_id 


inner join dw.DIM_DIAGNOSIS dx5
 on cl.diagnosis_5_dim_id  = dx5.diagnosis_dim_id 


inner join dw.DIM_BILL_TYPE bt
 on cl.bill_type_dim_id = bt.bill_type_dim_id

inner join dw.DIM_COMPANY dc
 on cl.company_dim_id = dc.company_dim_id


Where cl.primary_svc_date between d.startdate and d.enddate
and cl.company_dim_id in ('575')
and CL.WHOLE_CLAIM_STATUS_DIM_ID IN  (1,2) -- pulling in only paid claims -- use whole claim
and cl.io_flag_dim_id in ('1','2')
) ---select * from  claims

,sum_of_claims AS ( 

Select 

    cll.medicaid_no
   ,sum(distinct cll.net_amt) as sum_of_claims 

from claims cll

Group by cll.medicaid_no 

) 
  ----- this is the new part added below

SELECT medicaid_no, sum_of_claims FROM (
    SELECT sh.medicaid_no, sh.sum_of_claims, COUNT(*) OVER () AS total_cnt
         , ROW_NUMBER() OVER ( ORDER BY sh.sum_of_claims DESC ) AS rn
      FROM sum_of_claims sh
) 


 Where (rn)<(SELECT round(count(medicaid_no)*0.03) as percentt
                               from membership)
0 голосов
/ 11 мая 2018

Если я прочитал ваш вопрос, правильно, вы хотите получить первые 3% здесь?Это последний запрос:

select * from sum_of_claims;

Я думаю, вы хотите заменить это на что-то вроде следующего:

SELECT medicaid_no, sum_of_claims FROM (
    SELECT medicaid_no, sum_of_claims, COUNT(*) OVER () AS total_cnt
         , ROW_NUMBER() OVER ( ORDER BY sum_of_claims DESC ) AS rn
      FROM sum_of_claims
) WHERE rn <= 0.03 * total_cnt;

Это получит «верхние» 3% записей (где«top» определяется как те, у кого наибольшее количество требований).

Кстати, мне трудно поверить, что это то, что вы хотите:

,count(distinct claim_number) as sum_of_claims 

Это не будетдать сумму на всех!

Надеюсь, это поможет.

...