From 71fc72ba861b138984f73b57e9696b2514603cb9 Mon Sep 17 00:00:00 2001 From: sonzsara Date: Wed, 15 Jul 2026 15:52:49 +0530 Subject: [PATCH 1/3] Add documentation for Community Nurse Visits by Facility query --- .../community_nurse_visits_by_facility_kc.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Care/Operations/community_nurse_visits_by_facility_kc.md diff --git a/Care/Operations/community_nurse_visits_by_facility_kc.md b/Care/Operations/community_nurse_visits_by_facility_kc.md new file mode 100644 index 0000000..1650528 --- /dev/null +++ b/Care/Operations/community_nurse_visits_by_facility_kc.md @@ -0,0 +1,87 @@ + +# Community Nurse Visits by Facility + +> Count of community nurse visits grouped by facility for patients belonging to a given organization + +## Purpose + +Counts the number of completed community-nurse visits per facility, scoped to living patients within a specified organization. + +## Parameters + +| Parameter | Type | Description | Example | +|-----------|------|-------------|---------| +| `organization_id` | TEXT | Organization external ID to scope patients (matched against `emr_organization.external_id`) | `'org-uuid-1234'` | +| `date` | DATE / range | Metabase date filter (typically bound to `emr_questionnaireresponse.created_date`) | `'2026-07-01'` | + +--- + +## Query + +```sql +WITH org_id AS ( + SELECT emr_organization.id + FROM emr_organization + WHERE emr_organization.deleted = FALSE + -- AND emr_organization.external_id::text = {{organization_id}} +), +filtered_patients AS ( + SELECT emr_patient.id + FROM emr_patient + INNER JOIN org_id ON TRUE + WHERE emr_patient.deceased_datetime IS NULL + AND emr_patient.organization_cache && ARRAY[org_id.id]::integer[] +), +community_nurse_visits AS ( + SELECT DISTINCT + emr_questionnaireresponse.id AS questionnaireresponse_id, + emr_questionnaireresponse.encounter_id, + DATE(emr_questionnaireresponse.created_date) AS visit_date + FROM emr_questionnaireresponse + INNER JOIN filtered_patients + ON filtered_patients.id = emr_questionnaireresponse.patient_id + CROSS JOIN LATERAL jsonb_array_elements(emr_questionnaireresponse.responses) AS response_element + CROSS JOIN LATERAL jsonb_array_elements(response_element -> 'values') AS answer_element + WHERE emr_questionnaireresponse.questionnaire_id IN (3, 67) + AND emr_questionnaireresponse.status = 'completed' + AND emr_questionnaireresponse.encounter_id IS NOT NULL + AND response_element ->> 'question_id' IN ( + 'd602b9b2-d4cd-43d7-99d3-3d0169095eba', + 'edf6799d-88c4-4f9d-8ced-552dde6ad6af' + ) + AND answer_element ->> 'value' = 'Community Nurse' + --[[AND {{date}}]] +), +visit_with_facility AS ( + SELECT + community_nurse_visits.visit_date, + facility_facility.id AS facility_id, + facility_facility.name AS facility_name + FROM community_nurse_visits + INNER JOIN emr_encounter + ON emr_encounter.id = community_nurse_visits.encounter_id + INNER JOIN facility_facility + ON facility_facility.id = emr_encounter.facility_id + AND facility_facility.deleted = FALSE +) +SELECT + visit_with_facility.facility_name, + COUNT(*) AS community_nurse_visit_count +FROM visit_with_facility +GROUP BY + visit_with_facility.facility_id, + visit_with_facility.facility_name +ORDER BY + community_nurse_visit_count DESC, + visit_with_facility.facility_name; +``` + +## Notes + +- **Hardcoded IDs:** + - `questionnaire_id IN (3, 67)` — community nurse questionnaires + Update if questionnaires or questions change. +- **`organization_id` is required** (no `[[...]]` wrapper) — the query will not run without a value. +- Results are ordered by visit count descending, then alphabetically by facility name for ties. + +*Last updated: 2026-07-15* From affb58e5a71855060d84044a41c9bcfcf22ae419 Mon Sep 17 00:00:00 2001 From: sonzsara Date: Mon, 3 Aug 2026 11:03:36 +0530 Subject: [PATCH 2/3] Refactor Community Nurse Visits query for improved filtering and clarity --- .../community_nurse_visits_by_facility_kc.md | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Care/Operations/community_nurse_visits_by_facility_kc.md b/Care/Operations/community_nurse_visits_by_facility_kc.md index 1650528..48ca1a6 100644 --- a/Care/Operations/community_nurse_visits_by_facility_kc.md +++ b/Care/Operations/community_nurse_visits_by_facility_kc.md @@ -22,58 +22,65 @@ Counts the number of completed community-nurse visits per facility, scoped to li WITH org_id AS ( SELECT emr_organization.id FROM emr_organization - WHERE emr_organization.deleted = FALSE - -- AND emr_organization.external_id::text = {{organization_id}} + WHERE emr_organization.deleted = false + --AND emr_organization.external_id::text = {{organization_id}} ), -filtered_patients AS ( - SELECT emr_patient.id - FROM emr_patient - INNER JOIN org_id ON TRUE - WHERE emr_patient.deceased_datetime IS NULL - AND emr_patient.organization_cache && ARRAY[org_id.id]::integer[] +filtered_encounters AS ( + SELECT emr_encounter.id, + emr_encounter.patient_id, + emr_encounter.facility_id + FROM emr_encounter + INNER JOIN facility_facility + ON facility_facility.id = emr_encounter.facility_id + AND facility_facility.deleted = false + INNER JOIN org_id + ON facility_facility.geo_organization_cache && ARRAY[org_id.id]::integer[] + WHERE emr_encounter.status NOT IN ('entered_in_error', 'cancelled') ), community_nurse_visits AS ( SELECT DISTINCT emr_questionnaireresponse.id AS questionnaireresponse_id, - emr_questionnaireresponse.encounter_id, + filtered_encounters.encounter_id, + filtered_encounters.facility_id, DATE(emr_questionnaireresponse.created_date) AS visit_date - FROM emr_questionnaireresponse - INNER JOIN filtered_patients - ON filtered_patients.id = emr_questionnaireresponse.patient_id + FROM ( + SELECT filtered_encounters.id AS encounter_id, + filtered_encounters.patient_id, + filtered_encounters.facility_id + FROM filtered_encounters + ) AS filtered_encounters + INNER JOIN emr_questionnaireresponse + ON emr_questionnaireresponse.encounter_id = filtered_encounters.encounter_id + INNER 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 response_element CROSS JOIN LATERAL jsonb_array_elements(response_element -> 'values') AS answer_element - WHERE emr_questionnaireresponse.questionnaire_id IN (3, 67) + WHERE emr_questionnaireresponse.deleted = false + AND emr_questionnaireresponse.questionnaire_id IN (3, 67) AND emr_questionnaireresponse.status = 'completed' AND emr_questionnaireresponse.encounter_id IS NOT NULL AND response_element ->> 'question_id' IN ( - 'd602b9b2-d4cd-43d7-99d3-3d0169095eba', - 'edf6799d-88c4-4f9d-8ced-552dde6ad6af' + 'd602b9b2-d4cd-43d7-99d3-3d0169095eba', + 'edf6799d-88c4-4f9d-8ced-552dde6ad6af' ) AND answer_element ->> 'value' = 'Community Nurse' --[[AND {{date}}]] -), -visit_with_facility AS ( - SELECT - community_nurse_visits.visit_date, - facility_facility.id AS facility_id, - facility_facility.name AS facility_name - FROM community_nurse_visits - INNER JOIN emr_encounter - ON emr_encounter.id = community_nurse_visits.encounter_id - INNER JOIN facility_facility - ON facility_facility.id = emr_encounter.facility_id - AND facility_facility.deleted = FALSE ) SELECT - visit_with_facility.facility_name, + facility_facility.name AS facility_name, COUNT(*) AS community_nurse_visit_count -FROM visit_with_facility +FROM community_nurse_visits +INNER JOIN facility_facility + ON facility_facility.id = community_nurse_visits.facility_id + AND facility_facility.deleted = false GROUP BY - visit_with_facility.facility_id, - visit_with_facility.facility_name + community_nurse_visits.facility_id, + facility_facility.name ORDER BY - community_nurse_visit_count DESC, - visit_with_facility.facility_name; + + facility_facility.name; ``` ## Notes From 75ad58fea338b86073f375f60d119cd348d2a0c6 Mon Sep 17 00:00:00 2001 From: Sona Sara Shibu Date: Mon, 3 Aug 2026 15:28:44 +0530 Subject: [PATCH 3/3] Update community_nurse_visits_by_facility_kc.md --- Care/Operations/community_nurse_visits_by_facility_kc.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Care/Operations/community_nurse_visits_by_facility_kc.md b/Care/Operations/community_nurse_visits_by_facility_kc.md index 48ca1a6..ba04455 100644 --- a/Care/Operations/community_nurse_visits_by_facility_kc.md +++ b/Care/Operations/community_nurse_visits_by_facility_kc.md @@ -51,10 +51,6 @@ community_nurse_visits AS ( ) AS filtered_encounters INNER JOIN emr_questionnaireresponse ON emr_questionnaireresponse.encounter_id = filtered_encounters.encounter_id - INNER 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 response_element CROSS JOIN LATERAL jsonb_array_elements(response_element -> 'values') AS answer_element WHERE emr_questionnaireresponse.deleted = false