【问题标题】:SQL/Oracle: How to fetch start date row and end date from separate rows for single employee having multiple records in Employee table?SQL/Oracle:如何从单独的行中获取在 Employee 表中有多个记录的单个员工的开始日期行和结束日期?
【发布时间】:2020-12-08 13:04:15
【问题描述】:

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
  • 单条记录的Emp ID应该是原样
  • Emp ID 有两个或 更多行:
    • 考虑行:Startdate
    • 考虑 ENDDATE:从 ENDATE> sysdate 或 ENDDATE=null 或最新的行开始

输出应该是:

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

【问题讨论】:

  • 我听不懂这个问题。 “考虑”是什么意思?您正在组合来自不同行的值,但您没有解释逻辑。似乎有某种优先级。
  • @GordonLinoff:考虑意味着应该作为最终结果显示的行。
  • 。 .您的结果结合了多行的值。您不只显示一行。
  • 但是我已经给出了关于我的用例的输出。能否请您详细说明。我们需要显示的行在“考虑行”部分下,在那个“考虑行”中有列结束日期,它的值根据第二个业务规则来

标签: sql oracle sql-tuning


【解决方案1】:

如果这个断言是真的;

对于每个 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

【讨论】:

  • 但我们并不总是需要更高的人员 ID。它可能是未来的员工,但今天我们需要显示其以前的记录,并且在开始日期之后我们需要显示他的新人员 ID 记录。
  • 所以不能用 WHERE startdate
  • 否 这些不能忽略。 ROW 必须使用您的上述查询。还有很多其他领域 90,我刚刚给出了某些领域。那么 PID 上的 Max 会实现吗?让我测试
  • 最小开始日期也不起作用,因为它将始终返回最小日期。假设我们有 3 条记录,我们需要记录 2,那么它返回最小日期
  • 以上查询未返回 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2019-11-02
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多