我正在尝试根据记录添加到表中的日期查找gorpaud_pin
的最新值。
如果没有记录,则整个查询返回零记录。
我需要的是一条gorpaud_pin
空白值的记录。
SELECT spriden_id,
spriden_last_name,
spriden_first_name,
gorpaud_pin
FROM spriden
LEFT JOIN gorpaud A
ON spriden_pidm = A.gorpaud_pidm
AND A.gorpaud_chg_ind = 'P'
AND A.gorpaud_pin IS NOT NULL
WHERE spriden_change_ind IS NULL
AND spriden_entity_ind = 'P'
AND to_char(A.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS') =
(SELECT max(to_char(B.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS'))
FROM gorpaud B
WHERE B.gorpaud_pidm = A.gorpaud_pidm
AND B.gorpaud_chg_ind = 'P'
AND B.gorpaud_pin IS NOT NULL)
答案 0 :(得分:1)
您可以使用Oracle的分析功能(如dense_rank
)进行编号,然后过滤掉所有未排名“最高”的记录。
您可以使用dense_rank
或rank
,而不是row_number
。有细微差别,您需要哪一个取决于您希望如何处理重复行(具有相同的日期)。如果这不是问题,我想你可以使用其中任何一个。
SELECT
spriden_id,
spriden_last_name,
spriden_first_name
FROM
(SELECT
s.spriden_id,
s.spriden_last_name,
s.spriden_first_name,
DENSE_RANK() OVER (
PARTITION BY s.spriden_id
ORDER BY g.gorpaud_activity_date DESC) AS rank
FROM spriden s
LEFT JOIN gorpaud g
ON g.gorpaud_pidm = s.spriden_pidm
AND g.gorpaud_chg_ind = 'P'
AND g.gorpaud_pin IS NOT NULL)
WHERE
rank = 1
请注意,您可以安全地在日期值上使用MAX
或ORDER BY
。您不需要先将它们转换为字符。如果没有转换,查询可能会更快并且更具可读性。
答案 1 :(得分:0)
尝试将thr gorpaud部分合并到一个单独的子查询中,并将其连接到它。类似的东西:
select
spriden_id,
spriden_last_name,
spriden_first_name,
gorpaud_pin
FROM
spriden
left outer join
(select a.* from gorpaud a
where to_char(A.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS') =
(SELECT max(to_char(B.gorpaud_activity_date, 'YYYY-MM-DD HH24:MI:SS'))
FROM gorpaud B
WHERE B.gorpaud_pidm = A.gorpaud_pidm
AND B.gorpaud_chg_ind = 'P'
AND B.gorpaud_pin IS NOT NULL)) T
on spriden_pidm = t.gorpaud_pm