场景
在业务数据中可能遇到这样的需求。希望获取最新时间的某条记录中的某个值。此时就需要使用KEEP(DENSE_RANK FIRST/LAST)来处理数据了。
比如:
我想从上面这个查询结果中获取最新时间以及最新时间对应的SUBMT_PERS_NM
获取最新时间:
select max(SUBMT_TM) FROM BD_EXCE_TRCK where SHIP_ID = '68500396940'
获取最新时间对应的SUBMT_PERS_NM
:
select SUBMT_PERS_NM FROM BD_EXCE_TRCK where SHIP_ID = '68500396940' and SUBMT_TM = (select max(SUBMT_TM) FROM BD_EXCE_TRCK where SHIP_ID = '68500396940')
但是这样写有很大的局限性。
下面介绍一个函数:
max( ) KEEP (DENSE_RANK FIRST ORDER BY desc)
KEEP
keep的意思就是“保持”,会保持满足括号内条件的记录,用ORDER BY 后自然会有FIRST和LAST了。
DENSE_RANK
DENSE_RANK是排序策略。例如,它会将两个第二名排在第一名之后,之后还是第三名排在第二名之后。
FIRST/LAST
FIRST/LAST就是对数据进行筛选了。
select max(SUBMT_PERS_NM) KEEP (DENSE_RANK FIRST ORDER BY SUBMT_TM desc) from BD_EXCE_TRCK where SHIP_ID = '68500396940'
如有不当之处,欢迎大佬指正!