简体   繁体   English

在sql查询中选择Max date列,该列连接到其他列

[英]Select Max date column in a sql query, which is joined to other columns

I have an Oracle Query below我在下面有一个 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');

Which is giving below result这是给出以下结果

在此处输入图片说明

Now I am Person 900846 has multiple rows coming, now I need to extract the max date from this column for that I added the below logic but this is not working现在我是 Person 900846 有多个行,现在我需要从此列中提取最大日期,因为我添加了以下逻辑,但这不起作用

    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');

But now the Output is like below但现在输出如下

在此处输入图片说明

I am not sure how the outer join will be added in the second query and even after after that the result should 3 lines of data each for employee with max resignation date and blank is resignation date is null我不确定如何在第二个查询中添加外连接,即使在此之后,结果应该是 3 行数据,每个员工的最大辞职日期和空白是辞职日期为空

Output should look like below输出应如下所示在此处输入图片说明

can someone help me in this?有人可以帮我吗?

Thanks, Shivam谢谢,希瓦姆

You can use window functions ( ROW_NUMBER | RANK | DENSE_RANK | MAX OVER ) to rank your rows and only pick the latest per person.您可以使用窗口函数( ROW_NUMBER | RANK | DENSE_RANK | MAX OVER )对您的行进行排名,并且只选择每人最新的行。 Eg:例如:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM