From 14b3b0517506e41946624fc020f8ee86c27a8b18 Mon Sep 17 00:00:00 2001 From: sonzsara Date: Fri, 19 Jun 2026 15:31:05 +0530 Subject: [PATCH 1/4] Add Mobility Status Report by District documentation and SQL query --- .../mobility_status_report_by_district_kc.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Care/Clinical/mobility_status_report_by_district_kc.md diff --git a/Care/Clinical/mobility_status_report_by_district_kc.md b/Care/Clinical/mobility_status_report_by_district_kc.md new file mode 100644 index 0000000..25ebe90 --- /dev/null +++ b/Care/Clinical/mobility_status_report_by_district_kc.md @@ -0,0 +1,56 @@ + +# Mobility Status Report by District + +> Count of patients per district by their latest mobility status (Bedbound / Homebound / Independently Active) + +## Purpose + +For each patient, find the **most recent** answer to the mobility-status question and pivot the counts by the patient's district. + +## Parameters + +| Parameter | Type | Description | Example | +|-----------|------|-------------|---------| +| `date` | DATE / range | Metabase date filter (typically bound to `emr_questionnaireresponse.created_date`) | `'2026-06-01'` | + +--- + +## Query + +```sql +WITH latest_mobility AS ( + SELECT DISTINCT ON (emr_questionnaireresponse.patient_id) + emr_questionnaireresponse.patient_id, + emr_patient.organization_cache, + rs -> 'values' -> 0 ->> 'value' AS mobility_value + FROM emr_questionnaireresponse + JOIN emr_patient + ON emr_patient.id = emr_questionnaireresponse.patient_id + AND emr_patient.deleted = FALSE + AND emr_patient.deceased_datetime IS NULL + CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS rs + WHERE emr_questionnaireresponse.deleted = FALSE + AND emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb + AND rs ->> 'question_id' = 'e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695' + --[[AND {{date}}]] + ORDER BY emr_questionnaireresponse.patient_id, emr_questionnaireresponse.created_date DESC +) +SELECT + emr_organization.name AS district_name, + COUNT(*) FILTER (WHERE mobility_value ILIKE '%bedbound%') AS "Bedbound", + COUNT(*) FILTER (WHERE mobility_value ILIKE '%homebound%') AS "Homebound", + COUNT(*) FILTER (WHERE mobility_value ILIKE '%independent%') AS "Independently Active" +FROM latest_mobility +JOIN emr_organization + ON emr_organization.id = ANY(latest_mobility.organization_cache) + AND emr_organization.level_cache = 1 +GROUP BY emr_organization.name +ORDER BY emr_organization.name; +``` + +## Notes + +- **Metabase filter:** `[[AND {{date}}]]` is a field filter — bind it to `emr_questionnaireresponse.created_date` in the Metabase variable settings. +- Results are ordered alphabetically by `district_name`. + +*Last updated: 2026-06-19* From 531103042e8d4430bb26e6e02e6c9f55b31ab1bb Mon Sep 17 00:00:00 2001 From: sonzsara Date: Thu, 25 Jun 2026 12:28:06 +0530 Subject: [PATCH 2/4] Refactor SQL query in Mobility Status Report for improved readability and maintainability --- .../mobility_status_report_by_district_kc.md | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Care/Clinical/mobility_status_report_by_district_kc.md b/Care/Clinical/mobility_status_report_by_district_kc.md index 25ebe90..fae027c 100644 --- a/Care/Clinical/mobility_status_report_by_district_kc.md +++ b/Care/Clinical/mobility_status_report_by_district_kc.md @@ -19,31 +19,31 @@ For each patient, find the **most recent** answer to the mobility-status questio ```sql WITH latest_mobility AS ( - SELECT DISTINCT ON (emr_questionnaireresponse.patient_id) - emr_questionnaireresponse.patient_id, - emr_patient.organization_cache, - rs -> 'values' -> 0 ->> 'value' AS mobility_value - FROM emr_questionnaireresponse - JOIN emr_patient - ON emr_patient.id = emr_questionnaireresponse.patient_id - AND emr_patient.deleted = FALSE - AND emr_patient.deceased_datetime IS NULL - CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS rs - WHERE emr_questionnaireresponse.deleted = FALSE - AND emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb - AND rs ->> 'question_id' = 'e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695' - --[[AND {{date}}]] - ORDER BY emr_questionnaireresponse.patient_id, emr_questionnaireresponse.created_date DESC + SELECT DISTINCT ON (emr_questionnaireresponse.patient_id) + emr_questionnaireresponse.patient_id, + emr_patient.organization_cache, + rs -> 'values' -> 0 ->> 'value' AS mobility_value + FROM emr_questionnaireresponse + JOIN emr_patient + ON emr_patient.id = emr_questionnaireresponse.patient_id + + AND emr_patient.deceased_datetime IS NULL + CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS rs + WHERE emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb + + AND rs ->> 'question_id' = 'e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695' + --[[AND {{date}}]] + ORDER BY emr_questionnaireresponse.patient_id, emr_questionnaireresponse.created_date DESC ) SELECT - emr_organization.name AS district_name, - COUNT(*) FILTER (WHERE mobility_value ILIKE '%bedbound%') AS "Bedbound", - COUNT(*) FILTER (WHERE mobility_value ILIKE '%homebound%') AS "Homebound", - COUNT(*) FILTER (WHERE mobility_value ILIKE '%independent%') AS "Independently Active" + emr_organization.name AS district_name, + COUNT(*) FILTER (WHERE mobility_value ILIKE '%bedbound%') AS "Bedbound", + COUNT(*) FILTER (WHERE mobility_value ILIKE '%homebound%') AS "Homebound", + COUNT(*) FILTER (WHERE mobility_value ILIKE '%independent%') AS "Independently Active" FROM latest_mobility JOIN emr_organization - ON emr_organization.id = ANY(latest_mobility.organization_cache) - AND emr_organization.level_cache = 1 + ON emr_organization.id = ANY(latest_mobility.organization_cache) + AND emr_organization.level_cache = 1 GROUP BY emr_organization.name ORDER BY emr_organization.name; ``` From a5f42f610bb33816d62251400a9dbc79a1d3fc5b Mon Sep 17 00:00:00 2001 From: sonzsara Date: Thu, 2 Jul 2026 12:19:13 +0530 Subject: [PATCH 3/4] Update mobility status report query to filter completed responses --- Care/Clinical/mobility_status_report_by_district_kc.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Care/Clinical/mobility_status_report_by_district_kc.md b/Care/Clinical/mobility_status_report_by_district_kc.md index fae027c..60157d1 100644 --- a/Care/Clinical/mobility_status_report_by_district_kc.md +++ b/Care/Clinical/mobility_status_report_by_district_kc.md @@ -29,9 +29,10 @@ WITH latest_mobility AS ( AND emr_patient.deceased_datetime IS NULL CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS rs - WHERE emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb - + WHERE emr_questionnaireresponse.questionnaire_id = 69 + AND emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb AND rs ->> 'question_id' = 'e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695' + AND emr_questionnaireresponse.status = 'completed' --[[AND {{date}}]] ORDER BY emr_questionnaireresponse.patient_id, emr_questionnaireresponse.created_date DESC ) @@ -44,6 +45,7 @@ FROM latest_mobility JOIN emr_organization ON emr_organization.id = ANY(latest_mobility.organization_cache) AND emr_organization.level_cache = 1 + GROUP BY emr_organization.name ORDER BY emr_organization.name; ``` From a30e8399e3beedc490c11e2cd9e64a64cf2984c7 Mon Sep 17 00:00:00 2001 From: Sona Sara Shibu Date: Thu, 2 Jul 2026 12:40:15 +0530 Subject: [PATCH 4/4] Update mobility_status_report_by_district_kc.md --- Care/Clinical/mobility_status_report_by_district_kc.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Care/Clinical/mobility_status_report_by_district_kc.md b/Care/Clinical/mobility_status_report_by_district_kc.md index 60157d1..f366142 100644 --- a/Care/Clinical/mobility_status_report_by_district_kc.md +++ b/Care/Clinical/mobility_status_report_by_district_kc.md @@ -29,10 +29,11 @@ WITH latest_mobility AS ( AND emr_patient.deceased_datetime IS NULL CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS rs - WHERE emr_questionnaireresponse.questionnaire_id = 69 + WHERE emr_questionnaireresponse.questionnaire_id = 69 +AND emr_questionnaireresponse.status = 'completed' AND emr_questionnaireresponse.responses @> '[{"question_id": "e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695"}]'::jsonb AND rs ->> 'question_id' = 'e4b0d3f4-77fb-4fb6-9213-9c62fa6b5695' - AND emr_questionnaireresponse.status = 'completed' + --[[AND {{date}}]] ORDER BY emr_questionnaireresponse.patient_id, emr_questionnaireresponse.created_date DESC )