【发布时间】: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