-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhospital_readmissions.sql
More file actions
192 lines (162 loc) · 4.98 KB
/
hospital_readmissions.sql
File metadata and controls
192 lines (162 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
Select * from hospital_readmissions;
--Data Cleaning
--Standardize Age Groups
UPDATE hospital_readmissions
SET age = REPLACE(age, '[', '');
UPDATE hospital_readmissions
SET age = REPLACE(age, ')', '');
UPDATE hospital_readmissions
SET age = REGEXP_REPLACE(age, '(.*)-(.*)', '\1-\2');
SELECT COUNT(*) FROM hospital_readmissions;
--Check Missing Specialties
SELECT medical_specialty, COUNT(*)
FROM hospital_readmissions
GROUP BY medical_specialty
ORDER BY COUNT(*) DESC;
--Analysis
--Readmission Rate
SELECT
readmitted,
COUNT(*) AS count,
ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM hospital_readmissions), 2) AS percentage
FROM hospital_readmissions
GROUP BY readmitted;
--Readmission Rate by Specialty
SELECT
medical_specialty,
COUNT(*) AS total_admissions,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions,
ROUND(100.0 * SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) / COUNT(*), 2) AS readmission_rate
FROM hospital_readmissions
GROUP BY medical_specialty
ORDER BY readmission_rate DESC;
--Most Common Diagnoses (Primary Diagnosis)
SELECT
diag_1,
COUNT(*) AS diagnosis_count
FROM hospital_readmissions
GROUP BY diag_1
ORDER BY diagnosis_count DESC
LIMIT 10;
--Average Stay by Specialty
SELECT
medical_specialty,
ROUND(AVG(time_in_hospital), 2) AS avg_stay
FROM hospital_readmissions
GROUP BY medical_specialty
ORDER BY avg_stay DESC;
--Age Group Analysis
SELECT
age,
COUNT(*) AS total_admissions,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions,
ROUND(100.0 * SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) / COUNT(*), 2) AS readmission_rate
FROM hospital_readmissions
GROUP BY age
ORDER BY age;
--Diabetes Medication Impact
SELECT
diabetes_med,
COUNT(*) AS total_patients,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions,
ROUND(100.0 * SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) / COUNT(*), 2) AS readmission_rate
FROM hospital_readmissions
GROUP BY diabetes_med;
--Compute readmission rate by department using a CTE
WITH department_readmissions AS (
SELECT
medical_specialty,
COUNT(*) AS total_admissions,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions
FROM hospital_readmissions
GROUP BY medical_specialty
)
SELECT
medical_specialty,
total_admissions,
readmissions,
ROUND(100.0 * readmissions / total_admissions, 2) AS readmission_rate
FROM department_readmissions
ORDER BY readmission_rate DESC;
--Patient Age Group Analysis (CTE to Compute Age Group Metrics)
WITH age_group_stats AS (
SELECT
age,
COUNT(*) AS total_patients,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmitted_patients
FROM hospital_readmissions
GROUP BY age
)
SELECT
age,
total_patients,
readmitted_patients,
ROUND(100.0 * readmitted_patients / total_patients, 2) AS readmission_rate
FROM age_group_stats
ORDER BY age;
--Create a view that you can easily query for reporting.
CREATE OR REPLACE VIEW readmission_by_specialty AS
WITH department_readmissions AS (
SELECT
medical_specialty,
COUNT(*) AS total_admissions,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions
FROM hospital_readmissions
GROUP BY medical_specialty
)
SELECT
medical_specialty,
total_admissions,
readmissions,
ROUND(100.0 * readmissions / total_admissions, 2) AS readmission_rate
FROM department_readmissions;
SELECT * FROM readmission_by_specialty ORDER BY readmission_rate DESC;
--View for Patients with Multiple Readmissions
CREATE OR REPLACE VIEW high_risk_patients AS
WITH readmission_count AS (
SELECT
age,
medical_specialty,
COUNT(*) AS total_visits,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions
FROM hospital_readmissions
GROUP BY age, medical_specialty
)
SELECT
age,
medical_specialty,
total_visits,
readmissions,
ROUND(100.0 * readmissions / total_visits, 2) AS readmission_rate
FROM readmission_count
WHERE readmissions > 1;
SELECT * FROM high_risk_patients ORDER BY readmission_rate DESC;
CREATE OR REPLACE FUNCTION refresh_high_risk_patients()
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
DROP VIEW IF EXISTS high_risk_patients;
CREATE VIEW high_risk_patients AS
WITH readmission_count AS (
SELECT
age,
medical_specialty,
COUNT(*) AS total_visits,
SUM(CASE WHEN readmitted = 'yes' THEN 1 ELSE 0 END) AS readmissions
FROM hospital_readmissions
GROUP BY age, medical_specialty
)
SELECT
age,
medical_specialty,
total_visits,
readmissions,
ROUND(100.0 * readmissions / total_visits, 2) AS readmission_rate
FROM readmission_count
WHERE readmissions > 1;
RAISE NOTICE 'High-risk patient view refreshed successfully';
END;
$$;
SELECT refresh_high_risk_patients();
SELECT * FROM high_risk_patients;