我正在尝试根据两个日期选择最近一行(利率IntRate
)。最优先的日期是EffDate
,而第二个日期是LastMaintenance
。 EffDate
具有IntRate
生效的日期。所以格式有这样的,MM/DD/YYYY
。 LastMaintenance
列最后一次以SYSDATE
。
例如,如果我在同一天内更改IntRate
,我会在历史记录表中获得两行。两者都具有相同的EffDate
但不同的LastMaintenance
日期。
目前,我正在尝试根据给定帐户的IntRate
历史记录表格选择最新的IntRate
。所以我想根据日期选择最新的IntRate
。与该日期最接近的IntRate
是我想要使用的。
问题是,当IntRate
相同但EffDate
不同时,我无法弄清楚如何选择最新的DateLastMaintenance
。
在下图中,如何选择价值为IntRate
的{{1}}?我想要那个,因为即使null
相同,EffDate
字段对DateLastMaintenance
值也更新。
我有类似的东西来获取给定AcctNbr的最新null
以及我想要最新值的日期。
EffDate
这将给我一个SELECT EffDate
FROM (SELECT *
FROM AcctRateHist X
WHERE X.AcctNbr = A.AcctNbr -- R.Acctnbr
AND X.EffDate <= TO_DATE('09-26-2017', 'MM-DD-YYYY') -- The date to get the most recent value for
ORDER BY X.EffDate DESC, X.DateLastMaint DESC)
WHERE ROWNUM = 1;
的9月14日,但当我把它连接到一个外部查询时,我得到的所有行的EffDate
为9/14/2017,所以我现在需要查看EffDate
列。
我尝试选择DateLastMaintenance
,但得到ROWNUM = 1
为0.0375,而不是IntRate
值为1(null
,我没有得到为什么它拿起那个..)。
ROWNUM = 2
答案 0 :(得分:1)
我认为你想使用元组:
(X.EffDate, X.DateLastMaint) =
(SELECT EffDate, DateLastMaint -- This gets the EffDate of 9/14/2017
FROM (SELECT *
FROM AcctRateHist X
WHERE X.AcctNbr = A.AcctNbr AND
X.EffDate <= DATE '2017-09-26' -- The date to get the most recent value for
ORDER BY X.EffDate DESC, X.DateLastMaint DESC)
WHERE ROWNUM = 1
)
答案 1 :(得分:1)
窗口函数非常适合此任务。这是一个DENSE_RANK示例。
create table acctratehist ( acctnbr int, intrate number (9,3), effdate date, datelastmaint timestamp);
insert into acctratehist values (89, 2.125, DATE '2018-03-11', TIMESTAMP '2018-03-11 11:00:00');
insert into acctratehist values (89, 2.375, DATE '2018-03-11', TIMESTAMP '2018-03-11 15:00:00');
insert into acctratehist values (89, 2.825, DATE '2018-03-12', TIMESTAMP '2018-03-12 13:00:00');
insert into acctratehist values (52, 2.000, DATE '2018-03-11', TIMESTAMP '2018-03-11 15:00:00');
insert into acctratehist values (52, 2.333, DATE '2018-03-12', TIMESTAMP '2018-03-12 13:00:00');
select t.acctnbr, t.effdate, t.intrate
from (
select acctnbr, intrate, effdate, dense_rank() over (partition by acctnbr, effdate order by datelastmaint desc) as dlmrank
from acctratehist
) t
where t.dlmrank = 1
order by t.acctnbr, t.effdate