| | 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 | }}} |