Как найти предпоследний элемент массива, а если его нет - получить NULL

Коллеги, есть запрос:

WITH cte AS
    (
        SELECT
    ROW_NUMBER() OVER(PARTITION BY gcs.collaborator_id ORDER BY ser.delivery_date DESC) rn,
        gcs.collaborator_id as collId
        , gcs.collaborator_fullname
        , cs.hire_date
        , cs.position_name as posName
        , cs.position_parent_name
        , ser.delivery_date
        , ser.expire_date
        , ser.id AS sert_id
        , als.id AS activ_learning
        , als.start_usage_date
        , DATEDIFF(MONTH, ser.delivery_date, getDate()) as diff
        , clr.[data].value('(collaborator/custom_elems/custom_elem[name=''valSert''])[1]/value[1]', 'varchar(20)') as valSert
        , CAST(CASE WHEN DATEADD(DAY, DATEDIFF(DAY, 0, Getdate()), -1) = DATEADD(dd, DATEDIFF(d, 0, clr.[data].value('(collaborator/change_logs/change_log[last()]/date)[1]', 'datetime')), 0) THEN 1 ELSE 0 END AS bit) as isNewPosition
        , cs.current_state as workState
        , cs.is_dismiss as dismissState
        , req.status_id as reqStatus
        , clr.[data].value('(collaborator/change_logs/change_log[last()]/position_name)[1]', 'varchar(50)') as Position
FROM group_collaborators gcs
    JOIN collaborators cs on gcs.collaborator_id = cs.id
    JOIN collaborator clr on cs.id = clr.id
    LEFT JOIN certificates ser ON cs.id = ser.person_id AND ser.type_name LIKE 'Валютный сертификат'
    LEFT JOIN active_learnings als ON cs.id = als.person_id AND als.course_id = 6487888464122890146
    LEFT JOIN requests req ON cs.id = req.person_id AND req.request_type_id = 6883003852694109236
WHERE gcs.code LIKE 'valSert_group'
    )
SELECT *
    FROM cte
WHERE rn = 1;

Вот в этой строке выводится название должности из XML документа, из массива change_logs:

, clr.[data].value('(collaborator/change_logs/change_log[last()]/position_name)[1]', 'varchar(50)') as Position

Т.е. к примеру, в документе, где есть вот такой массив:

<change_logs>
    <change_log>
        <position_name>стажер</position_name>
    </change_log>
    <change_log>
        <position_name>менеджер</position_name>
    </change_log>
    <change_log>
        <position_name>управляющий центром</position_name>
    </change_log>
</change_logs>

я получу "Управляющего центром". Помогите, пожалуйста, сформировать запрос, чтобы получить значение предпоследнего элемента массива, т.е. "менеджер". А так же - что будет, если в массиве только один элемент и предпоследнего не будет?


Ответы (0 шт):