| 180 | |
| 181 | == Напреден извештај за извлекување на статистики за еден Person објект |
| 182 | {{{ |
| 183 | WITH |
| 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 | }}} |