| 184 | | selected_person_reports AS ( |
| 185 | | SELECT * FROM report WHERE person_id = :person_id |
| 186 | | ), |
| 187 | | |
| 188 | | academic AS ( |
| 189 | | SELECT r.created_at, ar.academic_field, ar.report_id |
| 190 | | FROM report r |
| 191 | | JOIN academicreport ar ON r.report_id = ar.report_id |
| 192 | | JOIN institution i ON i.institution_id = ar.institution_id |
| 193 | | WHERE r.person_id = :person_id |
| 194 | | ), |
| 195 | | |
| 196 | | employment AS ( |
| 197 | | SELECT e.start_date, COALESCE(e.end_date, CURRENT_DATE) AS end_date, e.income_per_month |
| 198 | | FROM employmentreport e |
| 199 | | JOIN report r ON r.report_id = e.report_id |
| 200 | | WHERE r.person_id = :person_id |
| 201 | | ), |
| 202 | | |
| 203 | | medical AS ( |
| 204 | | SELECT d.short_description, d.is_chronic |
| 205 | | FROM report r |
| 206 | | JOIN medicalreport mr ON r.report_id = mr.report_id |
| 207 | | JOIN medicalreport_diagnosis mrd ON mrd.report_id = mr.report_id |
| 208 | | JOIN diagnosis d ON d.diagnosis_id = mrd.diagnosis_id |
| 209 | | WHERE r.person_id = :person_id |
| 210 | | ), |
| 211 | | |
| 212 | | criminal AS ( |
| 213 | | SELECT cr.descriptive_punishment, cr.resolved as is_resolved |
| 214 | | FROM report r |
| 215 | | JOIN criminalreport cr ON r.report_id = cr.report_id |
| 216 | | JOIN crimetype ct ON ct.crime_type_id = cr.crime_type_id |
| 217 | | WHERE r.person_id = :person_id |
| 218 | | ), |
| 219 | | |
| 220 | | ordered_academic_reports_by_date AS ( |
| 221 | | SELECT |
| 222 | | ar.academic_field, |
| 223 | | r.created_at, |
| 224 | | ROW_NUMBER() OVER (PARTITION BY ar.academic_field ORDER BY r.created_at) AS row_num |
| 225 | | FROM report r |
| 226 | | JOIN academicreport ar ON ar.report_id = r.report_id |
| 227 | | WHERE r.person_id = :person_id |
| 228 | | ), |
| 229 | | |
| 230 | | filtered_academic_pathway AS ( |
| 231 | | SELECT academic_field, MIN(created_at) AS started_on |
| 232 | | FROM ordered_academic_reports_by_date |
| 233 | | GROUP BY academic_field |
| 234 | | ), |
| 235 | | |
| 236 | | employment_report_stats AS ( |
| 237 | | SELECT |
| 238 | | CAST(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) AS BIGINT) AS total_working_in_days, |
| 239 | | CAST(CEIL(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) / 30.0) AS BIGINT) AS total_working_in_months, |
| 240 | | CAST(CEIL(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) / 365.0) AS BIGINT) AS total_working_in_years, |
| 241 | | CAST(MAX(COALESCE(e.end_date, CURRENT_DATE) - e.start_date) AS BIGINT) AS longest_job_days |
| 242 | | FROM employmentreport e |
| 243 | | JOIN report r ON r.report_id = e.report_id |
| 244 | | WHERE r.person_id = :person_id |
| 245 | | ) |
| 246 | | SELECT |
| 247 | | -- General |
| 248 | | CAST((SELECT COUNT(*) FROM selected_person_reports) AS BIGINT) AS total_reports_found, |
| 249 | | CAST((SELECT created_at::date FROM selected_person_reports ORDER BY created_at ASC LIMIT 1) AS DATE) AS first_report_of_person, |
| 250 | | CAST((SELECT created_at::date FROM selected_person_reports ORDER BY created_at DESC LIMIT 1) AS DATE) AS latest_report_of_person, |
| 251 | | -- Academic |
| 252 | | CAST((SELECT COUNT(*) FROM academic) AS BIGINT) AS academic_total, |
| 253 | | CAST((SELECT academic_field |
| 254 | | FROM academic |
| 255 | | GROUP BY academic_field |
| 256 | | ORDER BY COUNT(*) DESC |
| 257 | | LIMIT 1) AS TEXT) AS most_common_field, |
| 258 | | CAST((SELECT STRING_AGG(academic_field, ' → ' ORDER BY started_on) |
| 259 | | FROM filtered_academic_pathway) AS TEXT) AS education_path, |
| 260 | | -- Employment |
| 261 | | CAST((SELECT COUNT(*) FROM employment) AS BIGINT) AS job_count, |
| 262 | | (SELECT total_working_in_days FROM employment_report_stats), |
| 263 | | (SELECT total_working_in_months FROM employment_report_stats), |
| 264 | | (SELECT total_working_in_years FROM employment_report_stats), |
| 265 | | (SELECT longest_job_days FROM employment_report_stats), |
| 266 | | CAST((SELECT MAX(income_per_month) FROM employment) AS DOUBLE PRECISION) AS max_income_from_job, |
| 267 | | -- Medical |
| 268 | | CAST((SELECT COUNT(*) FROM medical) AS BIGINT) AS diagnosis_total, |
| 269 | | CAST((SELECT ROUND(SUM(CASE WHEN is_chronic THEN 1 ELSE 0 END)::decimal / COUNT(*), 2) |
| 270 | | FROM medical) AS DOUBLE PRECISION) AS chronic_ratio, |
| 271 | | CAST((SELECT short_description |
| 272 | | FROM medical |
| 273 | | GROUP BY short_description |
| 274 | | ORDER BY COUNT(*) DESC |
| 275 | | LIMIT 1) AS TEXT) AS most_frequent_diagnosis, |
| 276 | | -- Criminal |
| 277 | | CAST((SELECT COUNT(*) FROM criminal) AS BIGINT) AS criminal_case_total, |
| 278 | | CAST((SELECT ROUND(SUM(CASE WHEN is_resolved THEN 1 ELSE 0 END)::decimal / COUNT(*), 2) |
| 279 | | FROM criminal) AS DOUBLE PRECISION) AS resolution_ratio |
| 280 | | }}} |
| | 184 | selected_person_reports AS ( |
| | 185 | SELECT * FROM report WHERE person_id = :person_id |
| | 186 | ), |
| | 187 | |
| | 188 | academic AS ( |
| | 189 | SELECT r.created_at, ar.academic_field, ar.report_id |
| | 190 | FROM report r |
| | 191 | JOIN academicreport ar ON r.report_id = ar.report_id |
| | 192 | JOIN institution i ON i.institution_id = ar.institution_id |
| | 193 | WHERE r.person_id = :person_id |
| | 194 | ), |
| | 195 | |
| | 196 | employment AS ( |
| | 197 | SELECT e.start_date, COALESCE(e.end_date, CURRENT_DATE) AS end_date, e.income_per_month |
| | 198 | FROM employmentreport e |
| | 199 | JOIN report r ON r.report_id = e.report_id |
| | 200 | WHERE r.person_id = :person_id |
| | 201 | ), |
| | 202 | |
| | 203 | medical AS ( |
| | 204 | SELECT d.short_description, d.is_chronic |
| | 205 | FROM report r |
| | 206 | JOIN medicalreport mr ON r.report_id = mr.report_id |
| | 207 | JOIN medicalreport_diagnosis mrd ON mrd.report_id = mr.report_id |
| | 208 | JOIN diagnosis d ON d.diagnosis_id = mrd.diagnosis_id |
| | 209 | WHERE r.person_id = :person_id |
| | 210 | ), |
| | 211 | |
| | 212 | criminal AS ( |
| | 213 | SELECT cr.descriptive_punishment, cr.resolved as is_resolved |
| | 214 | FROM report r |
| | 215 | JOIN criminalreport cr ON r.report_id = cr.report_id |
| | 216 | JOIN crimetype ct ON ct.crime_type_id = cr.crime_type_id |
| | 217 | WHERE r.person_id = :person_id |
| | 218 | ), |
| | 219 | |
| | 220 | ordered_academic_reports_by_date AS ( |
| | 221 | SELECT |
| | 222 | ar.academic_field, |
| | 223 | r.created_at, |
| | 224 | ROW_NUMBER() OVER (PARTITION BY ar.academic_field ORDER BY r.created_at) AS row_num |
| | 225 | FROM report r |
| | 226 | JOIN academicreport ar ON ar.report_id = r.report_id |
| | 227 | WHERE r.person_id = :person_id |
| | 228 | ), |
| | 229 | |
| | 230 | filtered_academic_pathway AS ( |
| | 231 | SELECT academic_field, MIN(created_at) AS started_on |
| | 232 | FROM ordered_academic_reports_by_date |
| | 233 | GROUP BY academic_field |
| | 234 | ), |
| | 235 | |
| | 236 | employment_report_stats AS ( |
| | 237 | SELECT |
| | 238 | CAST(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) AS BIGINT) AS total_working_in_days, |
| | 239 | CAST(CEIL(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) / 30.0) AS BIGINT) AS total_working_in_months, |
| | 240 | CAST(CEIL(SUM(ABS(COALESCE(e.end_date, CURRENT_DATE) - e.start_date)) / 365.0) AS BIGINT) AS total_working_in_years, |
| | 241 | CAST(MAX(COALESCE(e.end_date, CURRENT_DATE) - e.start_date) AS BIGINT) AS longest_job_days |
| | 242 | FROM employmentreport e |
| | 243 | JOIN report r ON r.report_id = e.report_id |
| | 244 | WHERE r.person_id = :person_id |
| | 245 | ) |
| | 246 | SELECT |
| | 247 | -- General |
| | 248 | CAST((SELECT COUNT(*) FROM selected_person_reports) AS BIGINT) AS total_reports_found, |
| | 249 | CAST((SELECT created_at::date FROM selected_person_reports ORDER BY created_at ASC LIMIT 1) AS DATE) AS first_report_of_person, |
| | 250 | CAST((SELECT created_at::date FROM selected_person_reports ORDER BY created_at DESC LIMIT 1) AS DATE) AS latest_report_of_person, |
| | 251 | -- Academic |
| | 252 | CAST((SELECT COUNT(*) FROM academic) AS BIGINT) AS academic_total, |
| | 253 | CAST((SELECT academic_field |
| | 254 | FROM academic |
| | 255 | GROUP BY academic_field |
| | 256 | ORDER BY COUNT(*) DESC |
| | 257 | LIMIT 1) AS TEXT) AS most_common_field, |
| | 258 | CAST((SELECT STRING_AGG(academic_field, ' → ' ORDER BY started_on) |
| | 259 | FROM filtered_academic_pathway) AS TEXT) AS education_path, |
| | 260 | -- Employment |
| | 261 | CAST((SELECT COUNT(*) FROM employment) AS BIGINT) AS job_count, |
| | 262 | (SELECT total_working_in_days FROM employment_report_stats), |
| | 263 | (SELECT total_working_in_months FROM employment_report_stats), |
| | 264 | (SELECT total_working_in_years FROM employment_report_stats), |
| | 265 | (SELECT longest_job_days FROM employment_report_stats), |
| | 266 | CAST((SELECT MAX(income_per_month) FROM employment) AS DOUBLE PRECISION) AS max_income_from_job, |
| | 267 | -- Medical |
| | 268 | CAST((SELECT COUNT(*) FROM medical) AS BIGINT) AS diagnosis_total, |
| | 269 | CAST((SELECT ROUND(SUM(CASE WHEN is_chronic THEN 1 ELSE 0 END)::decimal / COUNT(*), 2) |
| | 270 | FROM medical) AS DOUBLE PRECISION) AS chronic_ratio, |
| | 271 | CAST((SELECT short_description |
| | 272 | FROM medical |
| | 273 | GROUP BY short_description |
| | 274 | ORDER BY COUNT(*) DESC |
| | 275 | LIMIT 1) AS TEXT) AS most_frequent_diagnosis, |
| | 276 | -- Criminal |
| | 277 | CAST((SELECT COUNT(*) FROM criminal) AS BIGINT) AS criminal_case_total, |
| | 278 | CAST((SELECT ROUND(SUM(CASE WHEN is_resolved THEN 1 ELSE 0 END)::decimal / COUNT(*), 2) |
| | 279 | FROM criminal) AS DOUBLE PRECISION) AS resolution_ratio; |
| | 280 | }}} |