Changes between Version 1 and Version 2 of AdvancedSqlAndStoredProcedures


Ignore:
Timestamp:
08/24/25 16:37:11 (9 days ago)
Author:
221007
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedSqlAndStoredProcedures

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