SELECT
ei.EMPLOYEE_ID,
-- 如果 eu.EMPLOYEE_ID 是 NULL (表示该员工无更新记录),则直接用主表职位。
-- 否则,比较日期,决定使用新职位还是旧职位。
CASE
WHEN eu.EMPLOYEE_ID IS NULL THEN ei.POSITION
WHEN eu.update_dt > ei.LAST_UPDATE_DT THEN eu.NEW_POSITION
ELSE ei.POSITION
END AS POSITION,
-- 日期的逻辑与上面类似
CASE
WHEN eu.EMPLOYEE_ID IS NULL THEN ei.LAST_UPDATE_DT
WHEN eu.update_dt > ei.LAST_UPDATE_DT THEN eu.update_dt
ELSE ei.LAST_UPDATE_DT
END AS LAST_UPDATE_DT
FROM
EMPLOYEE_INFO AS ei
LEFT JOIN (
-- 从 EMPLOYEE_UPDATE 表中,为每个员工找出“唯一且最晚”的那条记录。
SELECT
t1.EMPLOYEE_ID,
t1.NEW_POSITION,
t1.update_dt
FROM
EMPLOYEE_UPDATE AS t1
INNER JOIN (
-- 1. 先用 GROUP BY 找出每个员工最晚的更新时间
SELECT
EMPLOYEE_ID,
MAX(update_dt) AS max_dt
FROM
EMPLOYEE_UPDATE
GROUP BY
EMPLOYEE_ID
) AS t2
-- 2. 然后用这个最晚时间去和原表做JOIN,把对应的那整行记录(包括职位)给捞出来
ON t1.EMPLOYEE_ID = t2.EMPLOYEE_ID
AND t1.update_dt = t2.max_dt
) AS eu ON ei.EMPLOYEE_ID = eu.EMPLOYEE_ID
ORDER BY
ei.EMPLOYEE_ID;
# with
# temp as (
# row_number() over (
# partition by
# employee_id
# order by
# update_dt desc
# ) as rn,
# employee_id,
# new_position,
# update_dt
# from
# EMPLOYEE_UPDATE
# )
# select
# EMPLOYEE_ID,
# case
# when last_update_dt < update_dt then new_position
# else position
# end as position
# from
# EMPLOYEE_INFO ei
# left join temp t on t.EMPLOYEE_ID = ei.EMPLOYEE_ID
# and t.rn = 1;