sql - 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
- Emp ID 应按原样提供
- 具有两行或多行的 Emp ID:
- 考虑行:具有 Startdate <= sysdate(仅最新记录)
- 考虑 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);
解决方案
如果这个断言是真的;
对于每个 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
推荐阅读
- angular - 子组件隐藏时执行子组件功能
- azure-sqldw - Azure SQL 数据仓库中返回表类型的函数是否有替代方法?
- c# - Xamarin.IOS:无法解析引用 (System.Threading.Tasks.Extension.dll)
- r - R中的“合并”用NA替换实际值
- inno-setup - 设置完成后打开预定义的 url
- ruby - 如何使用 Ruby 从 S3 url 上传 Stripe identity_document?
- php - 在 wordpress 中创建自定义 slug 而不是 id
- unity3d - 自定义编辑器中的弹出字段在播放时重置
- java - 如何从 Spring 服务器运行批处理 (.bat) 文件
- angularjs - 表单对象AngularJs中不存在表单字段