首页 > 解决方案 > SQL/Oracle:如何从单独的行中获取在 Employee 表中有多个记录的单个员工的开始日期行和结束日期?

问题描述

Employee 表的问题是 EMployeeID 来了两次(个人 ID 是唯一的)。创建返回员工 ID 的单个数据的视图。用例:

EMPID     PID     Name    StartDate   End Date .......More Fields

217121  761331  Tefan   21-FEB-19   31-AUG-20
217121  767001  Tefan   01-SEP-20   null
602315  767002  Wolf    01-SEP-20   null
602315  764321  Wolf    01-DEC-15   31-AUG-20
766470  766472  Deva    14-JUL-20   31-DEC-22

输出应该是:

217121  761331  Tefan   21-FEB-19   null
602315  764321  Wolf    01-DEC-15   null
766470  766472  Deva    14-JUL-20   31-DEC-22

使用 SQL/Oracle。

当前查询需要 9 分钟来获取 30,000 条记录。(对于 50 条记录需要 5 到 10 秒,这是很多);我建议使用一些不同的角度:

select *  from 
(select t1.*,(select t.enddate from (select enddate,empid,
  ROW_NUMBER() OVER (PARTITION BY empid ORDER BY enddate desc) as seqnum
  from employee t2
  where t2.empid=t1.empid) t
   where seqnum=1)  As enddate_1 from (select * from
(select WED.*,ROW_NUMBER() OVER (PARTITION BY empid ORDER BY startdate desc) as seqnum from 
(select t1.*,COUNT(*) OVER (PARTITION BY empid) WDECOUNT from employee t1) WED
where WDECOUNT=1 or WED.startdate <= sysdate)) t1 WHERE seqnum=1);

标签: sqloraclesql-tuning

解决方案


如果这个断言是真的;

对于每个 EmployeeId,稍后的 StartDate 会返回更高的 PersonId

然后我可以建议使用一些 MAX/MIN 来提高查询效率。

像这样的东西;

SELECT DISTINCT e.EMPID, MAX(e.PID), e.Name, MIN(e.startdate), 
MAX(e.enddate) keep (dense_rank first order by enddate desc nulls first)
FROM employee e
WHERE e.startdate <= SYSDATE
GROUP BY e.EMPID, e.Name;

编辑; 包括 WHERE startdate < sysdate


推荐阅读