业务场景:需要在表中查询日期最大所在的行中利率的值。
场景复现:
先制造临时表数据:
WITH bond_yield AS(
SELECT 1 id, '20201012' tradedate , 'a' bond,2.95 yield FROM dual UNION ALL
SELECT 2 id, '20201013' tradedate , 'a' bond,2.85 yield FROM dual UNION ALL
SELECT 3 id, '20201014' tradedate , 'a' bond,2.91 yield FROM dual UNION ALL
SELECT 4 id, '20201015' tradedate , 'a' bond,2.77 yield FROM dual UNION ALL
SELECT 5 id, '20201012' tradedate , 'b' bond,2.32 yield FROM dual UNION ALL
SELECT 6 id, '20201013' tradedate , 'b' bond,2.35 yield FROM dual UNION ALL
SELECT 7 id, '20201014' tradedate , 'b' bond,2.67 yield FROM dual UNION ALL
SELECT 8 id, '20201015' tradedate , 'b' bond,2.39 yield FROM dual
)
select * from bond_yield
现在要查询日期最大且bond为a的利率的值
SELECT w.bond, MAX(w.yield) KEEP(DENSE_RANK last ORDER BY w.tradedate) yield FROM bond_yield w where w.bond='a' group by bond;
关键字解释:
KEEP
keep的意思就是“保持”,会保持满足括号内条件的记录,用ORDER BY 后自然会有FIRST和LAST了。
DENSE_RANK
DENSE_RANK是排序策略。例如,它会将两个第二名排在第一名之后,之后还是第三名排在第二名之后。
FIRST/LAST
FIRST/LAST就是对数据进行筛选了。这里我们筛选tradedate最大的记录。如果日期是一样的。就需要使用MAX()选取最大的值。