SQL - Get the Assignment IDs based on Person Number

WITH SplitPersonNumbers AS (

    SELECT 

        REGEXP_SUBSTR(:person_numbers, '[^,]+', 1, LEVEL) AS person_number,

        LEVEL AS sort_order

    FROM DUAL

    CONNECT BY LEVEL <= REGEXP_COUNT(:person_numbers, ',') + 1

),

RankedAssignments AS (

    SELECT 

        papf.person_number AS PersonNumber,

        paam.assignment_id AS AssignmentId, 

        paam.work_terms_assignment_id AS WorkTermsAssignmentId,

        ppos.period_of_service_id AS PeriodOfServiceId,

        ROW_NUMBER() OVER (PARTITION BY papf.person_number ORDER BY paam.effective_start_date DESC) AS rn,

        spn.sort_order

    FROM

        per_all_people_f papf

        JOIN per_person_names_f ppnf ON ppnf.person_id = papf.person_id

        JOIN per_periods_of_service ppos ON ppos.person_id = papf.person_id

        JOIN per_all_assignments_m paam ON paam.period_of_service_id = ppos.period_of_service_id

        JOIN per_all_assignments_m workterm ON workterm.assignment_id = paam.work_terms_assignment_id

        JOIN SplitPersonNumbers spn ON spn.person_number = papf.person_number

    WHERE

        SYSDATE BETWEEN papf.effective_start_date AND papf.effective_end_date

        AND ppnf.name_type = 'GLOBAL'

        AND SYSDATE BETWEEN ppnf.effective_start_date AND ppnf.effective_end_date

        AND paam.assignment_status_type IN ('ACTIVE', 'Active - Payroll Eligible')

        AND SYSDATE BETWEEN paam.effective_start_date AND paam.effective_end_date

        AND paam.primary_assignment_flag = 'Y'

        AND SYSDATE BETWEEN workterm.effective_start_date AND workterm.effective_end_date

),

FinalResult AS (

    SELECT 

        ROW_NUMBER() OVER (ORDER BY sort_order) AS seq,

        PersonNumber, 

        AssignmentId, 

        WorkTermsAssignmentId, 

        PeriodOfServiceId,

        sort_order

    FROM RankedAssignments

    WHERE rn = 1

)

SELECT 

    LPAD(seq, 2, '0') AS SequenceNumber,

    PersonNumber, 

    AssignmentId, 

    WorkTermsAssignmentId, 

    PeriodOfServiceId

FROM FinalResult

ORDER BY sort_order

 

I hope this blog post was helpful for you. If you have any questions or feedback, please leave a comment below.

SQL Queries (SQLQ)
Posted by : Mohammad