Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 156 additions & 0 deletions Care/Clinical/ESAS-r_pallium.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# ESAS-r Forms Filled (Pallium)

> Returns the count of ESAS-r forms filled, with optional filters for date, patient, and staff.

## Purpose

To track the number of ESAS-r (Edmonton Symptom Assessment System - revised) forms filled for patients, supporting symptom monitoring and quality of care.

## Parameters

| Parameter | Type | Description | Example |
|---------------|--------|---------------------------------------------|----------------|
| `date` | DATE | Filter by form date (optional) | '2025-12-01' |
| `patient_name`| TEXT | Filter by patient name (optional) | 'John Doe' |
| `staff_name` | TEXT | Filter by staff full name (optional) | 'Jane Smith' |

---

## Query

```sql
SELECT
COUNT(*) AS forms_filled_count
FROM emr_questionnaireresponse qr
JOIN emr_patient p ON qr.patient_id = p.id
JOIN users_user u ON qr.created_by_id = u.id
WHERE qr.questionnaire_id = 26

--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
[[AND {{date}} ]]
[[AND p.name = {{patient_name}} ]]
[[AND TRIM(u.first_name || ' ' || COALESCE(u.last_name, '')) = {{staff_name}} ]]
*/
;
```



## Drill-Down Query

> Returns detailed ESAS-r form information for each patient, including staff, and all ESAS-r symptom fields.

### Purpose

To provide a detailed list of ESAS-r form responses for each patient, supporting clinical review and patient-level analysis.

### Parameters

| Parameter | Type | Description | Example |
|---------------|--------|---------------------------------------------|----------------|
| `date` | DATE | Filter by form date (optional) | '2025-12-01' |
| `patient_name`| TEXT | Filter by patient name (optional) | 'John Doe' |
| `staff_name` | TEXT | Filter by staff full name (optional) | 'Jane Smith' |

---

```sql
SELECT
p.name AS patient_name,
p.gender,
EXTRACT(YEAR FROM CURRENT_DATE) - p.year_of_birth AS age,
pi.value AS MRnumber,
p.phone_number,
qr.created_date AS form_created_date,
TRIM(u.first_name || ' ' || COALESCE(u.last_name, '')) AS staff_name,
-- Each question as separate column
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = 'f960e788-a131-4764-a3ea-b25e8586f004'
LIMIT 1
) AS pain,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '9147b7b1-db85-44ad-b071-34ac4aff3019'
LIMIT 1
) AS tiredness,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '8db8d2b6-3660-4b19-9a80-7f7cd8f7de03'
LIMIT 1
) AS drowsiness,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = 'c2fb0cbe-6e74-486f-ba02-1f9f81291739'
LIMIT 1
) AS nausea,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '6d1836fb-d163-4524-a3a2-3dc7c99054dc'
LIMIT 1
) AS shortness_of_breath,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '7e95e2c7-8c98-482a-8cd6-448e2fd4fca6'
LIMIT 1
) AS depression,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = 'cdaf2000-7fc6-4bee-9a73-c6ed106f3397'
LIMIT 1
) AS anxiety,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '9ecc4269-8d7a-4822-9921-7ef0c1e63515'
LIMIT 1
) AS best_wellbeing,
(
SELECT val ->> 'value'
FROM jsonb_array_elements(qr.responses) resp
JOIN LATERAL jsonb_array_elements(resp -> 'values') val ON TRUE
WHERE resp ->> 'question_id' = '668ad395-4a92-47f0-89a8-58cd83a599a7'
LIMIT 1
) AS no_other_problem
FROM emr_questionnaireresponse qr
JOIN emr_patient p ON qr.patient_id = p.id
LEFT JOIN emr_patientidentifier pi ON pi.patient_id = p.id AND pi.config_id = 5
LEFT JOIN users_user u ON qr.created_by_id = u.id
WHERE qr.questionnaire_id = 26

--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
[[AND {{date}} ]]
[[AND p.name = {{patient_name}} ]]
[[AND TRIM(u.first_name || ' ' || COALESCE(u.last_name, '')) = {{staff_name}} ]]
*/
ORDER BY qr.created_date DESC, patient_name;
```


## Notes

- Metabase-specific filters (`[[...]]`) allow dynamic filtering in dashboards.
- The queries use `questionnaire_id = 26` to identify the ESAS-r form.
- Each question_id (e.g., `f960e788-a131-4764-a3ea-b25e8586f004`) corresponds to a specific ESAS-r symptom and is displayed as a separate column in the drill-down output.
- The `config_id = 5` condition is used to select the correct Medical Record number (MRnumber) for each patient.
- Ensure all referenced tables and fields exist and are mapped correctly.
- All filters are optional and applied dynamically by Metabase.

*Last updated: 2025-12-15*
192 changes: 192 additions & 0 deletions Care/Clinical/bladdercathetermethod_pallium.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
# Bladder Catheter Method

> Returns the count of patients by bladder catheter status, with optional filters for visit date, patient, and staff.

## Purpose

To analyze the distribution of bladder catheter methods/status among patients, supporting clinical reporting and device management.

## Parameters

| Parameter | Type | Description | Example |
|---------------|--------|---------------------------------------------|----------------|
| `visit_date` | DATE | Filter by visit date (optional) | '2025-12-01' |
| `patient_name` | TEXT | Filter by patient name (optional) | 'John Doe' |
| `staff_name` | TEXT | Filter by staff full name (optional) | 'Jane Smith' |

---

## Query

```sql
WITH latest_responses AS (
SELECT DISTINCT ON (patient_id)
emr_questionnaireresponse.patient_id,
emr_questionnaireresponse.responses,
emr_questionnaireresponse.created_by_id
FROM emr_questionnaireresponse
WHERE emr_questionnaireresponse.questionnaire_id IN (17)

--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
[[AND {{visit_date}}]]
*/
ORDER BY patient_id, created_date DESC
),
responses AS (
SELECT
lr.patient_id,
lr.created_by_id,
UPPER(
TRIM(
REPLACE(
COALESCE(val ->> 'value', val -> 'coding' ->> 'display'),
'_',
' '
)
)
) AS status
FROM
latest_responses lr,
jsonb_array_elements(lr.responses) AS resp,
jsonb_array_elements(resp -> 'values') AS val
WHERE
resp ->> 'question_id' IN (
'808f625b-3df1-4b4e-830e-9ee08f6a01b9'
)
)
SELECT
r.status AS "Status",
COUNT(DISTINCT r.patient_id) AS "Patient Count"
FROM
responses r
JOIN emr_patient p ON r.patient_id = p.id
LEFT JOIN users_user u ON r.created_by_id = u.id
WHERE 1=1

--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
[[AND p.name = {{patient_name}} ]]
[[AND TRIM(u.first_name || ' ' || COALESCE(u.last_name, '')) = {{staff_name}} ]]
*/
GROUP BY
r.status
ORDER BY
"Patient Count" DESC;
```



## Drill-Down Query

> Returns detailed patient information for each bladder catheter status, including demographics, staff, and device details.

### Purpose

To provide a detailed list of patients for each bladder catheter status, supporting patient-level review and device management.

### Parameters

| Parameter | Type | Description | Example |
|---------------|--------|---------------------------------------------|----------------|
| `visit_date` | DATE | Filter by visit date (optional) | '2025-12-01' |
| `catheter_type`| TEXT | Filter by catheter type (optional) | 'FOLEY' |
| `status` | TEXT | Filter by bladder catheter status (optional)| 'CBD' |
| `patient_name` | TEXT | Filter by patient name (optional) | 'John Doe' |
| `staff_name` | TEXT | Filter by staff full name (optional) | 'Jane Smith' |

---

```sql
WITH latest_responses AS (
SELECT DISTINCT ON (patient_id)
emr_questionnaireresponse.patient_id,
emr_questionnaireresponse.responses,
emr_questionnaireresponse.created_date,
emr_questionnaireresponse.created_by_id
FROM
emr_questionnaireresponse
WHERE
emr_questionnaireresponse.questionnaire_id = 17

--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
[[AND {{visit_date}}]]
*/
ORDER BY patient_id, created_date DESC
),
drill_data AS (
SELECT
p.name AS patient_name,
p.gender,
p.phone_number,
EXTRACT(YEAR FROM CURRENT_DATE) - p.year_of_birth AS age,
pi.value AS MRnumber,
lr.created_date,
TRIM(u.first_name || ' ' || COALESCE(u.last_name, '')) AS staff_name,
UPPER(
TRIM(
REPLACE(
COALESCE(
MAX(CASE WHEN resp->>'question_id' = '808f625b-3df1-4b4e-830e-9ee08f6a01b9' THEN val->>'value' END),
MAX(CASE WHEN resp->>'question_id' = '808f625b-3df1-4b4e-830e-9ee08f6a01b9' THEN val->'coding'->>'display' END)
),
'_', ' '
)
)
) AS status,
MAX(CASE
WHEN resp->>'question_id' = 'c64c2638-6ce0-4814-97b2-5fda4832c30a' THEN val->>'value'
WHEN resp->>'question_id' = 'd9708732-385a-4559-9169-2989837aa0fb' THEN val->>'value'
END
) AS catheter_type,
MAX(CASE WHEN resp->>'question_id' = 'ec38712c-21d2-4fae-b9b6-d29b788c2c06' THEN val->>'value' END) AS issues,
MAX(CASE WHEN resp->>'question_id' = 'dc94d0fd-8986-4fa9-b76e-79223cb73f3a' THEN val->>'value' END) AS size,
MAX(CASE WHEN resp->>'question_id' = '30f32642-f04a-48b5-8cf3-36eeb0f5c5d5' THEN val->>'value' END) AS sterile_water_uses,
MAX(CASE WHEN resp->>'question_id' = '1086dea0-5aa4-4e4f-9209-533cc20f4d7a' THEN val->>'value' END) AS change_on,
MAX(CASE WHEN resp->>'question_id' = '7b2b8458-3a12-4f85-b142-2efc7ef1a6c3' THEN val->>'value' END) AS next_catheter_change_date
FROM latest_responses lr
JOIN emr_patient p ON p.id = lr.patient_id
LEFT JOIN emr_patientidentifier pi ON pi.patient_id = p.id AND pi.config_id = 5
LEFT JOIN users_user u ON lr.created_by_id = u.id
LEFT JOIN LATERAL jsonb_array_elements(lr.responses) AS resp ON TRUE
LEFT JOIN LATERAL jsonb_array_elements(COALESCE(resp->'values', '[]'::jsonb)) AS val ON TRUE
WHERE resp->>'question_id' IN (
'808f625b-3df1-4b4e-830e-9ee08f6a01b9',
'c64c2638-6ce0-4814-97b2-5fda4832c30a',
'd9708732-385a-4559-9169-2989837aa0fb',
'ec38712c-21d2-4fae-b9b6-d29b788c2c06',
'dc94d0fd-8986-4fa9-b76e-79223cb73f3a',
'30f32642-f04a-48b5-8cf3-36eeb0f5c5d5',
'1086dea0-5aa4-4e4f-9209-533cc20f4d7a',
'7b2b8458-3a12-4f85-b142-2efc7ef1a6c3'
)
AND (
(val->>'value' IS NOT NULL AND val->>'value' <> '') OR
(val->'coding'->>'display' IS NOT NULL AND val->'coding'->>'display' <> '')
)
GROUP BY p.id, p.name, p.gender, p.phone_number, p.meta, pi.value, lr.created_date, u.first_name, u.last_name
)
SELECT *
FROM drill_data
--The following filters are Metabase-specific and will be replaced by Metabase if parameters are provided:
/*
WHERE 1=1
[[AND catheter_type ILIKE '%' || {{catheter_type}} || '%']]
[[AND status ILIKE '%' || {{status}} || '%']]
[[AND patient_name ={{patient_name}} ]]
[[AND staff_name {{staff_name}} ]]
*/
ORDER BY created_date DESC, patient_name;
```


## Notes

- Metabase-specific filters (`[[...]]`) allow dynamic filtering in dashboards.
- The queries use `questionnaire_id = 17` and specific question_ids to extract bladder catheter status and related details.
- The `config_id = 5` condition is used to select the correct Medical Record number (MRnumber) for each patient.
- Ensure all referenced tables and fields exist and are mapped correctly.
- All filters are optional and applied dynamically by Metabase.

*Last updated: 2025-12-15*
Loading