From cf54b036ef86bd7f17db80a36eea54a434624679 Mon Sep 17 00:00:00 2001 From: sonzsara Date: Mon, 4 May 2026 12:18:35 +0530 Subject: [PATCH 1/3] Add detailed query for discharged but incomplete IP encounters at SSMM --- .../discharged_but_incomplete_ssmm.md | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Care/Encounter/discharged_but_incomplete_ssmm.md diff --git a/Care/Encounter/discharged_but_incomplete_ssmm.md b/Care/Encounter/discharged_but_incomplete_ssmm.md new file mode 100644 index 0000000..597647a --- /dev/null +++ b/Care/Encounter/discharged_but_incomplete_ssmm.md @@ -0,0 +1,72 @@ +````markdown +# Discharged but Incomplete IP Encounters - SSMM + +> IP encounters that were marked as discharged more than a day ago but are still not marked as completed +## Purpose + +Identifies in-patient (`encounter_class = 'imp'`) encounters at SSMM whose status history shows a `discharged` event more than 1 day ago, yet the encounter's current `status` is **not** `completed`. + +## Parameters + +*This query has no parameters.* + +--- + +## Query + +```sql +WITH first_discharged AS ( + SELECT DISTINCT ON (e.id) + e.id AS encounter_id, + e.status AS current_status, + (discharged_status->>'moved_at')::timestamp + INTERVAL '5 hours 30 minutes' AS discharged_datetime + FROM emr_encounter e + CROSS JOIN LATERAL jsonb_array_elements(e.status_history->'history') AS discharged_status + WHERE e.encounter_class = 'imp' + AND e.deleted = FALSE + AND discharged_status->>'status' = 'discharged' + AND e.status != 'completed' + ORDER BY e.id, (discharged_status->>'moved_at')::timestamp +), +latest_bed AS ( + SELECT DISTINCT ON (fle.encounter_id) + fle.encounter_id, + fl.name AS bed_name, + fle.created_date AS bed_assigned_date + FROM emr_facilitylocationencounter fle + JOIN emr_facilitylocation fl ON fle.location_id = fl.id + WHERE fl.form = 'bd' + AND fl.root_location_id != 300 + ORDER BY fle.encounter_id, fle.created_date DESC +) +SELECT DISTINCT ON (p.id) + p.name AS patient_name, + pi.value AS ssmm_id, + fd.discharged_datetime, + fd.current_status, + lb.bed_name AS latest_bed, + lb.bed_assigned_date +FROM first_discharged fd +JOIN emr_encounter e ON fd.encounter_id = e.id +JOIN emr_patient p ON e.patient_id = p.id +LEFT JOIN emr_patientidentifier pi + ON p.id = pi.patient_id + AND pi.config_id = 21 +LEFT JOIN latest_bed lb ON e.id = lb.encounter_id +WHERE fd.discharged_datetime < CURRENT_TIMESTAMP - INTERVAL '1 day' + AND lb.bed_name IS NOT NULL +ORDER BY p.id, fd.discharged_datetime DESC, p.name; +``` + + +## Notes + +- **Hardcoded values:** + - `pi.config_id = 21` — SSMM patient identifier configuration. + - `fl.root_location_id != 300` — excludes fake beds. + - `fl.form = 'bd'` — only bed-type facility locations. +- This query has no Metabase parameters; the date threshold is fixed at "more than 1 day ago". + +*Last updated: 2026-05-04* + +```` From 529d7cbd34d03875b15481166ec26b581e7e7d2b Mon Sep 17 00:00:00 2001 From: sonzsara Date: Tue, 5 May 2026 15:28:39 +0530 Subject: [PATCH 2/3] Add detailed query for discharged but incomplete IP encounters at SSMM --- Care/Encounter/discharged_but_incomplete_ssmm.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Care/Encounter/discharged_but_incomplete_ssmm.md b/Care/Encounter/discharged_but_incomplete_ssmm.md index 597647a..f391f08 100644 --- a/Care/Encounter/discharged_but_incomplete_ssmm.md +++ b/Care/Encounter/discharged_but_incomplete_ssmm.md @@ -26,8 +26,9 @@ WITH first_discharged AS ( AND e.deleted = FALSE AND discharged_status->>'status' = 'discharged' AND e.status != 'completed' - ORDER BY e.id, (discharged_status->>'moved_at')::timestamp + ORDER BY e.id, (discharged_status->>'moved_at')::timestamp DESC ), + latest_bed AS ( SELECT DISTINCT ON (fle.encounter_id) fle.encounter_id, @@ -39,7 +40,8 @@ latest_bed AS ( AND fl.root_location_id != 300 ORDER BY fle.encounter_id, fle.created_date DESC ) -SELECT DISTINCT ON (p.id) + +SELECT p.name AS patient_name, pi.value AS ssmm_id, fd.discharged_datetime, @@ -49,12 +51,9 @@ SELECT DISTINCT ON (p.id) FROM first_discharged fd JOIN emr_encounter e ON fd.encounter_id = e.id JOIN emr_patient p ON e.patient_id = p.id -LEFT JOIN emr_patientidentifier pi - ON p.id = pi.patient_id - AND pi.config_id = 21 -LEFT JOIN latest_bed lb ON e.id = lb.encounter_id +LEFT JOIN emr_patientidentifier pi ON p.id = pi.patient_id AND pi.config_id = 21 +JOIN latest_bed lb ON e.id = lb.encounter_id WHERE fd.discharged_datetime < CURRENT_TIMESTAMP - INTERVAL '1 day' - AND lb.bed_name IS NOT NULL ORDER BY p.id, fd.discharged_datetime DESC, p.name; ``` From 4b615201be0e5f2782c656499fe79624092356cd Mon Sep 17 00:00:00 2001 From: sonzsara Date: Wed, 20 May 2026 13:57:27 +0530 Subject: [PATCH 3/3] updated query for discharged but incomplete IP encounters at SSMM to include patient_id and adjust discharged_datetime calculation --- .../discharged_but_incomplete_ssmm.md | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/Care/Encounter/discharged_but_incomplete_ssmm.md b/Care/Encounter/discharged_but_incomplete_ssmm.md index f391f08..f463a89 100644 --- a/Care/Encounter/discharged_but_incomplete_ssmm.md +++ b/Care/Encounter/discharged_but_incomplete_ssmm.md @@ -18,8 +18,9 @@ Identifies in-patient (`encounter_class = 'imp'`) encounters at SSMM whose statu WITH first_discharged AS ( SELECT DISTINCT ON (e.id) e.id AS encounter_id, + e.patient_id, e.status AS current_status, - (discharged_status->>'moved_at')::timestamp + INTERVAL '5 hours 30 minutes' AS discharged_datetime + (discharged_status->>'moved_at')::timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Kolkata' AS discharged_datetime FROM emr_encounter e CROSS JOIN LATERAL jsonb_array_elements(e.status_history->'history') AS discharged_status WHERE e.encounter_class = 'imp' @@ -27,21 +28,9 @@ WITH first_discharged AS ( AND discharged_status->>'status' = 'discharged' AND e.status != 'completed' ORDER BY e.id, (discharged_status->>'moved_at')::timestamp DESC -), - -latest_bed AS ( - SELECT DISTINCT ON (fle.encounter_id) - fle.encounter_id, - fl.name AS bed_name, - fle.created_date AS bed_assigned_date - FROM emr_facilitylocationencounter fle - JOIN emr_facilitylocation fl ON fle.location_id = fl.id - WHERE fl.form = 'bd' - AND fl.root_location_id != 300 - ORDER BY fle.encounter_id, fle.created_date DESC ) -SELECT +SELECT p.name AS patient_name, pi.value AS ssmm_id, fd.discharged_datetime, @@ -49,12 +38,22 @@ SELECT lb.bed_name AS latest_bed, lb.bed_assigned_date FROM first_discharged fd -JOIN emr_encounter e ON fd.encounter_id = e.id -JOIN emr_patient p ON e.patient_id = p.id +JOIN emr_patient p ON fd.patient_id = p.id LEFT JOIN emr_patientidentifier pi ON p.id = pi.patient_id AND pi.config_id = 21 -JOIN latest_bed lb ON e.id = lb.encounter_id +JOIN LATERAL ( + SELECT + fl.name AS bed_name, + fle.created_date AS bed_assigned_date + FROM emr_facilitylocationencounter fle + JOIN emr_facilitylocation fl ON fle.location_id = fl.id + WHERE fle.encounter_id = fd.encounter_id + AND fl.form = 'bd' + AND fl.root_location_id != 300 + ORDER BY fle.created_date DESC + LIMIT 1 +) lb ON TRUE WHERE fd.discharged_datetime < CURRENT_TIMESTAMP - INTERVAL '1 day' -ORDER BY p.id, fd.discharged_datetime DESC, p.name; +ORDER BY p.id, fd.discharged_datetime DESC, p.name ```