構造クエリとテーブル、および以下のクエリがお役に立てば幸いです。
構造テーブルとクエリ結果を確認できます: dbfiddle
集計なし:
with allow_category as (select unnest(array [
'cpt',
'drg',
'modifiers',
'secondaryDiagnosis',
'principalDiagnosis',
'secondaryProcedure',
'observationhours',
'dischargeStatus',
'principalprocedure',
'hcpcs',
'professionalEvaluationManagement'
]::text[]) category)
select distinct ctextid,
vbillid,
initcap(kcy.key) as typeofcorrection,
initcap(regexp_replace(kc.key, '([a-z])([A-Z])', '\1 \2', 'g')) as errorpara,
case when f ? 'from' then f -> 'from' ->> 'code' else '' end as oldvalue,
case when f ? 'to' then f -> 'to' ->> 'code' else f ->> 'code' end as newvalue
from qareport q
cross join jsonb_each(q.codemap) as kc
cross join jsonb_each(kc.value) as kcy
join jsonb_array_elements(kcy.value) f on true
where kc.key in (select * from allow_category)
and kcy.key in ('added', 'revised', 'removed')
and (
jsonb_array_length(kc.value -> 'added') > 0
or jsonb_array_length(kc.value -> 'revised') > 0
or jsonb_array_length(kc.value -> 'removed') > 0
);
集計あり:
with allow_category as (select unnest(array [
'cpt',
'drg',
'modifiers',
'secondaryDiagnosis',
'principalDiagnosis',
'secondaryProcedure',
'observationhours',
'dischargeStatus',
'principalprocedure',
'hcpcs',
'professionalEvaluationManagement'
]::text[]) category)
select distinct ctextid,
vbillid,
initcap(kcy.key) as typeofcorrection,
initcap(regexp_replace(kc.key, '([a-z])([A-Z])', '\1 \2', 'g')) as errorpara,
case when f ? 'from' then f -> 'from' ->> 'code' else '' end as oldvalue,
case
when f ? 'to' then f -> 'to' ->> 'code'
else string_agg(f ->> 'code', ',')
over (partition by ctextid, vbillid, kcy.key, kc.key) end as newvalue
from qareport q
cross join jsonb_each(q.codemap) as kc
cross join jsonb_each(kc.value) as kcy
join jsonb_array_elements(kcy.value) f on true
where kc.key in (select * from allow_category)
and kcy.key in ('added', 'revised', 'removed')
and (
jsonb_array_length(kc.value -> 'added') > 0
or jsonb_array_length(kc.value -> 'revised') > 0
or jsonb_array_length(kc.value -> 'removed') > 0
);