Changes between Version 2 and Version 3 of AdvancedSqlAndStoredProcedures


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedSqlAndStoredProcedures

    v2 v3  
    182182{{{
    183183WITH
    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    )
     246SELECT
     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}}}