根据另一个 CTE 百分比从列表中提取最高百分比的 ID

Pull top percent of IDs from a list based off of another CTE percentage

我有以下 CTE 来加入会员资格,然后为这些成员加入所有索赔(如果他们在日期参数内有索赔命中),现在我需要从总会员数 (=1961) 中加入声明 CTE 的 TOP 3% 或 0.03。我看到 1961*0.03 四舍五入为 59,因此我需要从索赔利用率最高的索赔中提取前 (59) 个医疗补助 ID。

因此,例如在 number_to_pull CTE 中给出了需要引入的线路(它给出了 3% 的成员资格),然后在 sum_of_claims CTE 我只想从 Claims CTE 中提取前 3% 的医疗补助 ID。因为成员资格可能会根据日期参数而变化我希望 sum_of_claims 具有类似下面的内容,但我不确定如何开始

最终结果是我将列出在调用的日期范围内每次索赔点击次数最多的 Medicaid ID 的列表顶部 (3%)

我需要这样的东西,但我希望它提取 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

我想要的最终结果是一个医疗补助 ID 列表和索赔总额,但这个列表只会是前 59 行 (3%)

MEDICAID_NO   SUM_OF_CLAIMS
111111         ,439.61 
333333         ,315.57 
444444         ,007.00 
555555         ,823.98 
888888         ,770.00 
777777         ,211.47 
9999999        ,157.61 
6666666        ,068.76 

如果我没看错你的问题,你想在这里获得前 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;

这将获得 "top" 3% 的记录(其中 "top" 定义为索赔金额最高的记录)。

顺便说一下,我很难相信这就是你想要的:

,count(distinct claim_number) as sum_of_claims 

那根本算不出来!

希望这对您有所帮助。

感谢 David F。我能够从声明中拉入前 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)