【发布时间】:2020-01-17 11:22:40
【问题描述】:
我有一个查看 EMPLOYEE 的报表日期,该报表日期捕获了多年来每天的员工信息。
作为初学者,我已经编写了此 sql (SAP HANA),但事实证明这非常缓慢且占用大量资源,并且虽然有效,但不可用。
我想在两个报告日期之间捕获 - 所有在职员工在最后一个日期,所有退出员工的结束日期早于第一个报告日期和他们被退出的第一个日期。
select E.EMPLOYEEID
, E.STATUS
, E.STARTDATE
, E.ENDDATE
, E.REPORTDATE
FROM
(
SELECT EMPLOYEEID, Max(REPORTDATE) as MaxDate
FROM “EMPLOYEETABLE”
WHERE REPORTDATE>= Date’2019-04-01’ AND REPORTDATE<=Date’2019-07-01’ AND STATUS='Active'
GROUP BY EMPLOYEEID
) r
LEFT JOIN "EMPLOYEETABLE" E
ON E. EMPLOYEEID =r. EMPLOYEEID AND E.REPORTDATE=r.MaxDate
UNION ALL
select E.EMPLOYEEID
, E.STATUS
, E.STARTDATE
, E.ENDDATE
, E.REPORTDATE
FROM
(
SELECT EMPLOYEEID, Min(REPORTDATE) as MinDate
FROM "EMPLOYEETABLE"
WHERE REPORTDATE>= date’2019-04-01’ AND REPORTDATE<=Date’2019-07-01’ AND STATUS='Withdrawn' AND ENDDATE>= Date’2019-04-01’
GROUP BY EMPLOYEEID
) w
LEFT JOIN "EMPLOYEETABLE" E
ON E. EMPLOYEEID =w. EMPLOYEEID AND E.REPORTDATE=w.MinDate
谁能帮助更有效地编写这个?
样本数据集
Reportdate EmployeeID startdate enddate status
01/04/2019 Steve 12/02/2012 Null Active
01/04/2019 Don 15/06/2016 Null Active
01/04/2019 John 14/03/2015 01/04/2019 Withdrawn
01/04/2019 Anna 12/05/2017 Null Active
02/04/2019 Steve 12/02/2012 Null Active
02/04/2019 Don 15/06/2016 Null Active
02/04/2019 John 14/03/2015 01/04/2019 Withdrawn
02/04/2019 Anna 12/05/2017 Null Active
03/04/2019 Steve 12/02/2012 Null Active
03/04/2019 Don 15/06/2016 Null Active
03/04/2019 John 14/03/2015 01/04/2019 Withdrawn
03/04/2019 Anna 12/05/2017 03/04/2019 Withdrawn
期望的输出
Reportdate EmployeeID startdate enddate status
03/04/2019 Steve 12/02/2012 Null Active
03/04/2019 Don 15/06/2016 Null Active
01/04/2019 Jon 14/03/2015 01/04/2019 Withdrawn
03/04/2019 Anna 12/05/2017 03/04/2019 Withdrawn
显然我的数据集非常大,因为每天都会出现相同的员工并添加新员工。
【问题讨论】:
-
请提供样本数据和期望的结果。
-
您有创建临时表的权限吗?通过编写临时结果来划分查询将大大提高性能。
-
您是否在查询中运行了
EXPLAIN PLAN?它可能会提供有关查询执行的更多信息。