Выберите столбец Максимальная дата в запросе sql, который объединяется с другими столбцами. - PullRequest
1 голос
/ 19 марта 2020

У меня есть Oracle Запрос ниже

    select papf.person_number, to_char(hrcd.SUBMITTED_DATE, 'DD-Mon-YYYY','NLS_DATE_LANGUAGE = American') as "Resignation Date", paam.last_update_date as assignmentupdate, hrcd.last_update_date as hrcdupdate, hth.last_update_date as hthupdate

from 
per_all_people_f papf, per_all_assignments_m paam, hrc_txn_header hth, HRC_TXN_DATA hrcd
where 
papf.person_id=paam.person_id
and paam.assignment_type IN ('E','C')
and paam.assignment_status_type in ('ACTIVE')
and paam.primary_flag = 'Y'
and paam.EFFECTIVE_LATEST_CHANGE ='Y'


and trunc(sysdate) between trunc(paam.effective_start_date) and trunc(paam.effective_end_date)
and trunc(sysdate) between trunc(papf.effective_start_date) and trunc(papf.effective_end_date)

and paam.person_id=hth.subject_id(+) 
and paam.assignment_id=hth.object_id(+)
and hth.module_identifier(+) IN ('Resignation','Terminations')
and hrcd.transaction_id(+)=hth.transaction_id

and papf.person_number IN ('901626', '900723', '900846');

, который дает результат ниже

enter image description here

Теперь я человек В 900846 появилось несколько строк, теперь мне нужно извлечь максимальную дату из этого столбца, для этого я добавил нижеприведенные логи c, но это не работает

    select papf.person_number, to_char(hrcd.SUBMITTED_DATE, 'DD-Mon-YYYY','NLS_DATE_LANGUAGE = American') as "Resignation Date", paam.last_update_date as assignmentupdate, hrcd.last_update_date as hrcdupdate, hth.last_update_date as hthupdate

from 
per_all_people_f papf, per_all_assignments_m paam, hrc_txn_header hth, HRC_TXN_DATA hrcd
where 
papf.person_id=paam.person_id
and paam.assignment_type IN ('E','C')
and paam.assignment_status_type in ('ACTIVE')
and paam.primary_flag = 'Y'
and paam.EFFECTIVE_LATEST_CHANGE ='Y'


and trunc(sysdate) between trunc(paam.effective_start_date) and trunc(paam.effective_end_date)
and trunc(sysdate) between trunc(papf.effective_start_date) and trunc(papf.effective_end_date)

and paam.person_id=hth.subject_id(+) 
and paam.assignment_id=hth.object_id(+)
and hth.module_identifier(+) IN ('Resignation','Terminations')
and hrcd.transaction_id(+)=hth.transaction_id

and hrcd.SUBMITTED_DATE = 
(SELECT MAX(hrcd2.SUBMITTED_DATE)
    FROM HRC_TXN_DATA hrcd2, hrc_txn_header hth2, per_all_assignments_m paam2
    WHERE hrcd2.TRANSACTION_ID = hrcd.TRANSACTION_ID
    AND hrcd2.transaction_id=hth2.transaction_id
    and hth2.module_identifier IN ('Resignation','Terminations')
    and paam2.assignment_id=hth2.object_id
    and paam2.assignment_id=paam.assignment_id
    )

and papf.person_number IN ('901626', '900723', '900846');

Но теперь вывод выглядит как ниже

enter image description here

Я не уверен, как будет добавлено внешнее объединение во втором запросе, и даже после этого в результате должно быть 3 строки данных для каждого сотрудника с максимальная дата отставки и пусто дата отставки равна нулю

Вывод должен выглядеть следующим образом enter image description here

Может кто-нибудь помочь мне в этом?

Спасибо Шивам

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете использовать оконные функции (ROW_NUMBER | RANK | DENSE_RANK | MAX OVER), чтобы ранжировать свои ряды и выбирать только последние для каждого человека. Например:

select person_number, "Resignation Date", assignmentupdate, hrcdupdate, hthupdate
from
(
  select
    papf.person_number,
    to_char(hrcd.submitted_date, 'DD-Mon-YYYY', 'NLS_DATE_LANGUAGE = American') as "Resignation Date",
    paam.last_update_date as assignmentupdate,
    hrcd.last_update_date as hrcdupdate,
    hth.last_update_date as hthupdate,
    hrcd.submitted_date,
    max(hrcd.submitted_date) over (partition by papf.person_number) as max_submitted_date
  from per_all_people_f papf
  join per_all_assignments_m paam on paam.person_id = papf.person_id
  left join hrc_txn_header hth on hth.subject_id = paam.person_id
                              and hth.object_id = paam.assignment_id
                              and hth.module_identifier IN ('Resignation', 'Terminations')
  left join  HRC_TXN_DATA hrcd on hrcd.transaction_id = hth.transaction_id
  where papf.person_number IN (901626, 900723, 900846)
  and paam.assignment_type IN ('E', 'C')
  and paam.assignment_status_type in ('ACTIVE')
  and paam.primary_flag = 'Y'
  and paam.effective_latest_change = 'Y'
  and trunc(sysdate) between trunc(paam.effective_start_date) and trunc(paam.effective_end_date)
  and trunc(sysdate) between trunc(papf.effective_start_date) and trunc(papf.effective_end_date)
)
where (submitted_date = max_submitted_date)
   or (submitted_date is null and max_submitted_date is null)
order by person_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...