当员工进入薪资组时,我需要找到effective date
。它发生在租用日期,重新生成日期或转移日期,以最新者为准。我想我想要做的是创建一个最近生效日期where C1.ACTION=('XFR') AND C1.PAYGROUP=A.PAYGROUP
的临时表,当该表中的同事是not
时,给我most recent hire date
。
最近的雇用日期是
CASE WHEN A.HIRE_DT<=A.REHIRE_DT THEN A.REHIRE_DT
ELSE A.HIRE_DT END MOST_REC_HIREDT
仅供参考我知道这个查询真的搞砸了,这就是我寻求帮助的原因。
SELECT DISTINCT
A.EMPLID
A.FIRST_NAME||' '||A.LAST_NAME WORKERNAME,
CASE
WHEN(Select Max(C1.EFFDT) FROM JOB C1
WHERE (C.EMPLID=C1.EMPLID
AND C1.ACTION=('TAF')
AND C1.PAYGROUP=A.PAYGROUP
AND C1.EFFDT>=(CASE WHEN A.HIRE_DT<A.REHIRE_DT THEN =A.REHIRE_DT
ELSE A.HIRE_DT END MR_HIRE_DT)))
WHEN A.EMPLID NOT IN JOB C1
THEN (CASE WHEN A.HIRE_DT<=A.REHIRE_DT
THEN A.REHIRE_DT
ELSE A.HIRE_DT END MR_HIRE_DT2)
ELSE 'Null' END EFFDT,
A.PAYGROUP
FROM EMPLOYEES A, PERSONAL_DATA B, JOB C
WHERE
A.EMPLID=B.EMPLID
AND
B.EMPLID=C.EMPLID
AND
A.PAYGROUP=C.PAYGROUP
AND
C.EMPL_STATUS in ('A','L','P','S')
使用ANSI连接语法非常重要,因为它有助于(很多)完成表格关联的逻辑。这里我们只有2个表,但在示例查询中有4个表别名正在使用(A,B,C和C1)。此外,它有助于使用与表名相关的表别名,例如E
的Employee
,J
的Job
。
您正在寻找的是来自表JOB
的“最新”日期,并且可以使用非常有用的函数row_number()
。它与over()
子句一起使用,该子句包含partition by
(有点类似于group by)和order by
。按日期降序排序时,最近日期的行号为1(由于使用了分区,每位员工)。因此,如果我们通过is_latest = 1
过滤下面的子查询,我们会为每位员工提供一行最新生效日期。请注意,这也消除了现在使用select distinct
的需要。
SELECT
E.EMPLID
, (E.FIRST_NAME || ' ' || E.LAST_NAME) WORKERNAME
, J.EFFDT PAYGROUP_EFFDT
, E.PAYGROUP
FROM EMPLOYEES E
INNER JOIN (
SELECT
JOB.*
, ROW_NUMBER() OVER (PARTITION BY EMPLID
ORDER BY EFFDT DESC) AS is_latest
FROM JOB
WHERE EMPL_STATUS IN ('A','L','P','S')
) J ON E.EMPLID=J.EMPLID AND J.is_latest = 1
我可能在这里过度简化任务,因为我不完全理解我们如何到达有关日期。但是,我正在做的是:
hire_dt
和rehire_dt
中的较大者查询:
select emplid, max(dt)
from
(
select emplid, greatest(nvl(hire_dt,rehire_dt),nvl(rehire_dt,hire_dt)) as dt from employees
union all
select emplid, effdt as dt from job where action = 'TAF' and empl_status in ('A','L','P','S')
)
group by emplid
order by emplid;