Дублирование результатов с помощью функции LISTAGG

Я вижу, что есть решения для аналогичного вопроса, но мне не удалось заставить их работать в моем сценарии. Я возвращаю повторяющиеся коды при использовании функции LISTAGG. Возвращаюсь сейчас:

введите здесь описание изображения

SELECT 
,CD.CLAIM
,CD.CLAIMLN
,CD.PROV_INVOICE_UNTS
,CD.APPR_UNTS
,CD.PROV_INVOICE_AMT
,CD.PROV_CNTRCT_AMT
,CD.PLAN_CNTRCT_AMT as PLAN_AMT
,LISTAGG(DX.DIAG_CD,', ') WITHIN GROUP (ORDER BY DX.LVL_CD)  AS DX_CODES

FROM CLAIM_DETAIL CD
INNER JOIN PATIENT_INTAKE_PLAN PIP
ON CD.PAT_NBR = PIP.PAT_NBR AND CD.ITK_ID = PIP.ITK_ID
INNER JOIN HEALTH_PLAN HP
ON HP.PLAN_ID = PIP.PLAN_ID
INNER JOIN PROVIDER_CCXPORTAL PR
ON PR.PROV_ID = CD.PROV_ID
INNER JOIN PROVIDER_PARENT PRP
ON PR.PROV_PRNT_ID = PRP.PROV_PRNT_ID
INNER JOIN PATIENT_CCXPORTAL PTP
ON PTP.PAT_NBR = CD.PAT_NBR 
INNER JOIN CLAIM C
ON C.CLM_ID = CD.CLM_ID
LEFT JOIN CLAIM_DIAGNOSIS DX
ON CD.CLM_ID = DX.CLM_ID

WHERE 
C.RCPT_DT >= '01-JUL-2014'

Мне нужно, чтобы он возвращался: введите здесь описание изображения


person tia97    schedule 07.08.2015    source источник
comment
Ваш запрос неполный. У вас есть list_agg(), но нет group by.   -  person Gordon Linoff    schedule 07.08.2015
comment
@GordonLinoff Привет, Гордон, у меня есть группа по функциям, которую я просто не скопировал достаточно глубоко. Мои извинения.   -  person tia97    schedule 07.08.2015


Ответы (2)


Используйте регулярное выражение, чтобы избавиться от дубликатов

....as PLAN_AMT,
RTRIM(
         REGEXP_REPLACE(
           (listagg(DX.DIAG_CD,',') WITHIN GROUP (ORDER BY DX.LVL_CD) ), 
           '([^,]*)(,\1)+($|,)', 
           '\1\3'),
         ',') AS DX_CODES
FROM......
person Mihai    schedule 07.08.2015
comment
Я пробовал это раньше, так как видел это как решение в другом сообщении, но после запуска я получил сообщение об ошибке, в котором говорилось, что строка слишком длинная. - person tia97; 07.08.2015
comment
@ tia97 Можете ли вы отредактировать свой вопрос с точной ошибкой? - person Mihai; 07.08.2015

Если в утверждении очень много DX_CODES, ваша строка может превышать максимальную длину для SQL varchar2.

Можете ли вы попробовать это вместо этого?

SELECT 
,CD.CLAIM
,CD.CLAIMLN
,CD.PROV_INVOICE_UNTS
,CD.APPR_UNTS
,CD.PROV_INVOICE_AMT
,CD.PROV_CNTRCT_AMT
,CD.PLAN_CNTRCT_AMT as PLAN_AMT
, (SELECT listagg(dx.diag_cd,',') within group ( order by dx.lvl_cd, dx.diag_cd ) FROM ( SELECT distinct clm_id, lvl_cd, diag_cd FROM claim_diagnosis ) dx WHERE dx.clm_id = cd.clm_id ) dx_codes
--,LISTAGG(DX.DIAG_CD,', ') WITHIN GROUP (ORDER BY DX.LVL_CD)  AS DX_CODES
FROM CLAIM_DETAIL CD
INNER JOIN PATIENT_INTAKE_PLAN PIP
ON CD.PAT_NBR = PIP.PAT_NBR AND CD.ITK_ID = PIP.ITK_ID
INNER JOIN HEALTH_PLAN HP
ON HP.PLAN_ID = PIP.PLAN_ID
INNER JOIN PROVIDER_CCXPORTAL PR
ON PR.PROV_ID = CD.PROV_ID
INNER JOIN PROVIDER_PARENT PRP
ON PR.PROV_PRNT_ID = PRP.PROV_PRNT_ID
INNER JOIN PATIENT_CCXPORTAL PTP
ON PTP.PAT_NBR = CD.PAT_NBR 
INNER JOIN CLAIM C
ON C.CLM_ID = CD.CLM_ID
--LEFT JOIN CLAIM_DIAGNOSIS DX
--ON CD.CLM_ID = DX.CLM_ID
WHERE 
C.RCPT_DT >= '01-JUL-2014'

Убедитесь, что в CLAIM_DIAGNOSIS.CLM_ID есть индекс.

person Matthew McPeak    schedule 07.08.2015