【发布时间】:2016-02-12 19:29:45
【问题描述】:
我试图找到解决方案,包括在我的联接中使用 row_number() 方法,但不知何故无法获得预期的结果。
我现在遇到的问题是基于这样一个事实,即连接表中的一些记录具有多个实例(1 到多个),具有相同的标准,这会导致重复,所以即使我认为我可以在日期上使用 min() 或 max(),我有相同 EffectDT 的情况会出现两次。
除此之外,如果我有没有“活动”记录的实例(XPIRDT IS NOT NULL),我需要提取过期记录,所以我会使用“ OR" 语句,或者在第一次连接没有产生任何记录并且在显示之前有一个案例条件来评估值的情况下简单地执行另一个连接来获取过期的记录?
这是我正在处理的示例数据的一个实例:
因此,上面的数据样本仍然会产生 2 条记录,我可以通过评估到期日期来消除一条,但如果所有记录都已过期,则会出现问题,因此不会检索任何内容.
LEFT OUTER JOIN PARTYXREF
ON MBR_PERSON.NAMEID = PARTYXREF.NAMEID
AND PARTYXREF.REFTYPE LIKE 'COMM'
LEFT JOIN (
SELECT *
FROM ADDRDATA TMP
WHERE TMP.ADDRTYPE = '2'
AND TMP.EFFECTDT = (SELECT MAX(EFFECTDT) FROM ADDRDATA TMP2 WHERE TMP2.ADDRID = TMP.ADDRID)
) MBR_ADDR
ON PARTYXREF.REFKEY = MBR_ADDR.ADDRID
我也尝试在我的“JOIN”语句中使用以下内容,但是我无法在我在这里硬编码值的地方使用连接键 (REFKEY),所以这确实有效,但可以'似乎没有包含在 join 语句中。
SELECT ADDR.*
FROM (SELECT tmp.*, row_number() OVER (ORDER BY XPIRDT DESC) AS SEQNUM
FROM ADDRDATA tmp
WHERE tmp.ADDRTYPE = '2'
AND tmp.ADDRID = 10948448
) ADDR
WHERE SEQNUM = 1
我在这方面浪费了太多时间,所以我需要其他人的看法! :)
【问题讨论】:
-
您错误地使用了
ROW_NUMBER函数。您还应该按其他列对数据进行分区(因此ROW_NUMBER函数可以按您的日期对满足某些条件的行进行排序) - 例如ROW_NUMBER() OVER (PARTITION BY ADDRID, EFFECTDT ORDER BY XPIRD DESC)。最终,类似的DENSE_RANK可以解决问题。
标签: sql oracle oracle11g greatest-n-per-group