Skip to content

Commit 04939d1

Browse files
author
Alexandra Pavlyshina
committed
shared-exclusions: add cms165_aggregate() planner wrapper
1 parent f04ab10 commit 04939d1

1 file changed

Lines changed: 232 additions & 0 deletions

File tree

aidbox-custom-operations/measure-evaluate/sql/02-shared-exclusions.sql

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,235 @@ RETURNS TABLE(patient_id text) AS $$
294294
AND o.effective_end <= p_mp_end
295295
AND (p_subject IS NULL OR o.patient_id = p_subject)
296296
$$ LANGUAGE sql STABLE;
297+
298+
-- ============================================================
299+
-- CMS165 aggregate wrapper
300+
-- PL/pgSQL wrapper that sets enable_nestloop = off before running
301+
-- the CMS165 aggregate query. On the legacy path (JSONB views)
302+
-- the PG planner mis-estimates CTE cardinality by 15,000x and
303+
-- picks nested-loop joins that take 75 s at 100 K patients.
304+
-- SET LOCAL inside this function forces hash joins → 7 s.
305+
-- ============================================================
306+
DROP FUNCTION IF EXISTS cms165_aggregate(timestamptz, timestamptz);
307+
308+
CREATE OR REPLACE FUNCTION cms165_aggregate(
309+
p_start timestamptz,
310+
p_end timestamptz
311+
)
312+
RETURNS TABLE (
313+
initial_population bigint,
314+
denominator bigint,
315+
denominator_exclusion bigint,
316+
numerator bigint,
317+
denominator_minus_exclusion bigint,
318+
measure_score numeric
319+
) AS $$
320+
BEGIN
321+
SET LOCAL enable_nestloop = off;
322+
323+
RETURN QUERY
324+
WITH mp AS (
325+
SELECT
326+
p_start AS mp_start,
327+
p_end AS mp_end,
328+
p_start + interval '6 months' AS mp_6mo
329+
),
330+
331+
qualifying_encounters AS (
332+
SELECT DISTINCT e.patient_id
333+
FROM encounter_flat e
334+
JOIN concepts c ON c.system = e.type_system AND c.code = e.type_code
335+
AND c.valueset_url IN (
336+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001',
337+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1240',
338+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1025',
339+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1023',
340+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016',
341+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1089',
342+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1080'
343+
)
344+
CROSS JOIN mp
345+
WHERE e.status = 'finished'
346+
AND e.period_start >= mp.mp_start AND e.period_start <= mp.mp_end
347+
),
348+
349+
essential_hypertension AS (
350+
SELECT DISTINCT c.patient_id
351+
FROM condition_flat c
352+
JOIN concepts vs ON vs.system = c.code_system AND vs.code = c.code
353+
AND vs.valueset_url = 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.104.12.1011'
354+
CROSS JOIN mp
355+
WHERE (c.verification_status IS NULL OR c.verification_status IN ('confirmed','unconfirmed','provisional','differential'))
356+
AND c.onset_date < mp.mp_6mo
357+
AND (c.abatement_date IS NULL OR c.abatement_date >= mp.mp_start)
358+
),
359+
360+
initial_pop AS (
361+
SELECT p.id AS patient_id
362+
FROM patient_flat p
363+
CROSS JOIN mp
364+
WHERE EXTRACT(YEAR FROM AGE(mp.mp_end, p.birth_date::date)) BETWEEN 18 AND 85
365+
AND p.id IN (SELECT patient_id FROM qualifying_encounters)
366+
AND p.id IN (SELECT patient_id FROM essential_hypertension)
367+
),
368+
369+
hospice AS (SELECT h.* FROM mp, LATERAL shared_hospice(mp.mp_start, mp.mp_end) h),
370+
371+
pregnancy_renal AS (
372+
SELECT DISTINCT c.patient_id FROM condition_flat c
373+
JOIN concepts vs ON vs.system = c.code_system AND vs.code = c.code
374+
AND vs.valueset_url IN (
375+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.378',
376+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.353',
377+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.109.12.1029',
378+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1002'
379+
)
380+
CROSS JOIN mp
381+
WHERE (c.verification_status IS NULL OR c.verification_status IN ('confirmed','unconfirmed','provisional','differential'))
382+
AND c.onset_date <= mp.mp_end
383+
AND (c.abatement_date IS NULL OR c.abatement_date >= mp.mp_start)
384+
),
385+
386+
esrd_procedures AS (
387+
SELECT DISTINCT pr.patient_id FROM procedure_flat pr
388+
JOIN concepts vs ON vs.system = pr.code_system AND vs.code = pr.code
389+
AND vs.valueset_url IN (
390+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.109.12.1012',
391+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.109.12.1013'
392+
)
393+
CROSS JOIN mp
394+
WHERE pr.status = 'completed'
395+
AND pr.performed_end <= mp.mp_end
396+
),
397+
398+
esrd_encounter AS (
399+
SELECT DISTINCT e.patient_id FROM encounter_flat e
400+
JOIN concepts vs ON vs.system = e.type_system AND vs.code = e.type_code
401+
AND vs.valueset_url = 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.109.12.1014'
402+
CROSS JOIN mp
403+
WHERE e.status = 'finished' AND e.period_start <= mp.mp_end
404+
),
405+
406+
palliative AS (SELECT h.* FROM mp, LATERAL shared_palliative(mp.mp_start, mp.mp_end) h),
407+
408+
patients_66_plus AS (
409+
SELECT p.id AS patient_id, EXTRACT(YEAR FROM AGE(mp.mp_end, p.birth_date::date)) AS age
410+
FROM patient_flat p CROSS JOIN mp
411+
WHERE EXTRACT(YEAR FROM AGE(mp.mp_end, p.birth_date::date)) >= 66
412+
),
413+
has_frailty AS (SELECT h.* FROM mp, LATERAL shared_has_frailty(mp.mp_start, mp.mp_end) h),
414+
advanced_illness AS (SELECT h.* FROM mp, LATERAL shared_advanced_illness(mp.mp_start, mp.mp_end) h),
415+
dementia_meds AS (SELECT h.* FROM mp, LATERAL shared_dementia_meds(mp.mp_start, mp.mp_end) h),
416+
advanced_illness_frailty AS (
417+
SELECT p66.patient_id FROM patients_66_plus p66
418+
JOIN has_frailty f ON f.patient_id = p66.patient_id
419+
LEFT JOIN advanced_illness ai ON ai.patient_id = p66.patient_id
420+
LEFT JOIN dementia_meds dm ON dm.patient_id = p66.patient_id
421+
WHERE p66.age BETWEEN 66 AND 80
422+
AND (ai.patient_id IS NOT NULL OR dm.patient_id IS NOT NULL)
423+
UNION
424+
SELECT p66.patient_id FROM patients_66_plus p66
425+
JOIN has_frailty f ON f.patient_id = p66.patient_id
426+
WHERE p66.age >= 81
427+
),
428+
429+
nursing_home AS (SELECT h.* FROM mp, LATERAL shared_nursing_home(mp.mp_start, mp.mp_end) h),
430+
431+
den_excl AS (
432+
SELECT patient_id FROM hospice
433+
UNION SELECT patient_id FROM pregnancy_renal
434+
UNION SELECT patient_id FROM esrd_procedures
435+
UNION SELECT patient_id FROM esrd_encounter
436+
UNION SELECT patient_id FROM palliative
437+
UNION SELECT patient_id FROM advanced_illness_frailty
438+
UNION SELECT patient_id FROM nursing_home
439+
),
440+
441+
bp_observations AS (
442+
SELECT o.patient_id, o.id AS obs_id, o.effective_date, o.encounter_id,
443+
o.systolic, o.diastolic
444+
FROM observation_bp_flat o
445+
CROSS JOIN mp
446+
WHERE o.status IN ('final', 'amended', 'corrected')
447+
AND o.effective_date >= mp.mp_start
448+
AND o.effective_date <= mp.mp_end
449+
),
450+
451+
disqualifying_encounters AS (
452+
SELECT e.id AS encounter_id, e.patient_id, e.period_start, e.period_end
453+
FROM encounter_flat e
454+
JOIN concepts vs ON vs.system = e.type_system AND vs.code = e.type_code
455+
AND vs.valueset_url IN (
456+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307',
457+
'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1010'
458+
)
459+
WHERE e.status = 'finished'
460+
UNION
461+
SELECT e.id, e.patient_id, e.period_start, e.period_end
462+
FROM encounter_flat e
463+
WHERE e.status = 'finished'
464+
AND e.class_code IN ('EMER', 'IMP', 'ACUTE', 'NONAC', 'PRENC', 'SS')
465+
),
466+
467+
qualifying_bp AS (
468+
SELECT bp.*
469+
FROM bp_observations bp
470+
WHERE NOT EXISTS (
471+
SELECT 1 FROM disqualifying_encounters de WHERE de.encounter_id = bp.encounter_id
472+
)
473+
AND NOT EXISTS (
474+
SELECT 1 FROM disqualifying_encounters de
475+
WHERE de.patient_id = bp.patient_id
476+
AND bp.effective_date::date >= de.period_start::date
477+
AND bp.effective_date::date <= de.period_end::date
478+
)
479+
),
480+
481+
most_recent_bp_day AS (
482+
SELECT patient_id, MAX(effective_date::date) AS bp_date
483+
FROM qualifying_bp
484+
GROUP BY patient_id
485+
),
486+
487+
bp_on_most_recent_day AS (
488+
SELECT qbp.patient_id,
489+
MIN(qbp.systolic) AS lowest_systolic,
490+
MIN(qbp.diastolic) AS lowest_diastolic
491+
FROM qualifying_bp qbp
492+
JOIN most_recent_bp_day mrd ON mrd.patient_id = qbp.patient_id
493+
AND qbp.effective_date::date = mrd.bp_date
494+
GROUP BY qbp.patient_id
495+
),
496+
497+
num AS (
498+
SELECT patient_id
499+
FROM bp_on_most_recent_day
500+
WHERE lowest_systolic < 140 AND lowest_diastolic < 90
501+
),
502+
503+
measure_results AS (
504+
SELECT
505+
p.patient_id,
506+
1 AS in_initial_population,
507+
1 AS in_denominator,
508+
CASE WHEN de.patient_id IS NOT NULL THEN 1 ELSE 0 END AS in_exclusion,
509+
CASE WHEN de.patient_id IS NULL AND n.patient_id IS NOT NULL THEN 1 ELSE 0 END AS in_numerator
510+
FROM initial_pop p
511+
LEFT JOIN den_excl de ON de.patient_id = p.patient_id
512+
LEFT JOIN num n ON n.patient_id = p.patient_id
513+
)
514+
515+
SELECT
516+
COUNT(*)::bigint,
517+
COUNT(*)::bigint,
518+
SUM(in_exclusion)::bigint,
519+
SUM(in_numerator)::bigint,
520+
(COUNT(*) - SUM(in_exclusion))::bigint,
521+
CASE
522+
WHEN COUNT(*) - SUM(in_exclusion) > 0
523+
THEN ROUND(SUM(in_numerator)::numeric / (COUNT(*) - SUM(in_exclusion)), 4)
524+
ELSE 0
525+
END
526+
FROM measure_results;
527+
END;
528+
$$ LANGUAGE plpgsql;

0 commit comments

Comments
 (0)