从符合条件的加入 table 中获取最新数据
Get most recent data from joined table with condition
我有这个查询:
SELECT V2.EMPID, V2.PDATE1, T3.JOB_POSITION_NM
FROM USER_VIEW V2
JOIN
(SELECT EMPID, JOB_POSITION_NM, EFFDT
FROM ( SELECT A.EMPID, B.JOB_POSITION_NM, A.EFFDT
FROM T_EMP A
JOIN T_JOB_MASTER B
ON A.JOB_POSITION = B.JOB_POSITION
ORDER BY EFFDT DESC)) T3
ON T3.EMPID = V2.EMPID
AND TO_CHAR (T3.EFFDT, 'YYYY-MM-DD') < TO_CHAR (V2.P_DATE1, 'YYYY-MM-DD')
示例数据如下:
User_View V2
empid | pdate1
--------------
EM001 | 2021-12-01
T3
empid | job_position_nm | effdt
--------------------------------
EM001 | Operator | 2016-06-12
EM001 | Sub Team Leader | 2018-10-01
EM001 | Team Leader 1 | 2020-07-01
EM001 | Team Leader 2 | 2022-01-03
但是由于 T3 查询有多个 EFFDT 数据小于 P_DATE1 它 returns 结果上的多行。
我想要 T3 上的 WHERE ROWNUM = 1
之类的东西来显示查询的单个结果。
有任何解决方法来实现类似的行为吗?谢谢
使用 CTE 和 row_number
分析函数(可能是 rank
,但是 - 看起来你最多想得到一行作为结果)。
此外,比较日期,不要将它们转换为字符串然后再比较这些字符串。你为什么要这样做?
with temp as
(select a.empid, b.job_position_nm, a.effdt,
row_number() over (order by a.effdt desc) rn
from t_emp a join t_job_master b on a.job_position = b.job_position
)
select v2.empid, v2.pdate1, t.job_position_nm
from user_view v2 join temp t on t.empid = v2.empid
and t.effdt < v2.p_date1
and t.rn = 1;
我有这个查询:
SELECT V2.EMPID, V2.PDATE1, T3.JOB_POSITION_NM
FROM USER_VIEW V2
JOIN
(SELECT EMPID, JOB_POSITION_NM, EFFDT
FROM ( SELECT A.EMPID, B.JOB_POSITION_NM, A.EFFDT
FROM T_EMP A
JOIN T_JOB_MASTER B
ON A.JOB_POSITION = B.JOB_POSITION
ORDER BY EFFDT DESC)) T3
ON T3.EMPID = V2.EMPID
AND TO_CHAR (T3.EFFDT, 'YYYY-MM-DD') < TO_CHAR (V2.P_DATE1, 'YYYY-MM-DD')
示例数据如下:
User_View V2
empid | pdate1
--------------
EM001 | 2021-12-01
T3
empid | job_position_nm | effdt
--------------------------------
EM001 | Operator | 2016-06-12
EM001 | Sub Team Leader | 2018-10-01
EM001 | Team Leader 1 | 2020-07-01
EM001 | Team Leader 2 | 2022-01-03
但是由于 T3 查询有多个 EFFDT 数据小于 P_DATE1 它 returns 结果上的多行。
我想要 T3 上的 WHERE ROWNUM = 1
之类的东西来显示查询的单个结果。
有任何解决方法来实现类似的行为吗?谢谢
使用 CTE 和 row_number
分析函数(可能是 rank
,但是 - 看起来你最多想得到一行作为结果)。
此外,比较日期,不要将它们转换为字符串然后再比较这些字符串。你为什么要这样做?
with temp as
(select a.empid, b.job_position_nm, a.effdt,
row_number() over (order by a.effdt desc) rn
from t_emp a join t_job_master b on a.job_position = b.job_position
)
select v2.empid, v2.pdate1, t.job_position_nm
from user_view v2 join temp t on t.empid = v2.empid
and t.effdt < v2.p_date1
and t.rn = 1;