您的位置:首页 > 数据库 > Oracle

oracle按照2个字段分区 over(partition by A,B order by C)

2017-08-24 12:48 701 查看

整理需求

笔者的业务理解能力一般,需求按照我的理解转化为数据库逻辑之后大致这个样子的:查询出TB_LOG中不同的SYSTEM_ID对应的每日的最新一条数据, 同时连接TB_LOG, TB_INFO, TB_TYPE 这3个表查出其它需要的字段值。

解决方案

解决该需求的核心是查出查询出TB_LOG中不同的SYSTEM_ID对应的每日的最新一条数据,然后根据外键再连表查询就容易多了。根据笔者的某位同事的设想,这里采用 over (PARTITION BY TB_LOG.SYSTEM_ID,TB_LOG.EXECUTE_DAY) 这2个字段的方法,这类似于 GROUP BY TB_LOG.SYSTEM_ID,TB_LOG.EXECUTE_DAY 的效果,再ORDER BY TB_LOG.CREATE_DATE DESC 按照创建时间倒排序,取ROW_NUM=1第一条数据即可。事实证明这是靠谱的,最终SQL如下。

SELECT T4.*, T3.*
from (SELECT T1.*, T2.*
FROM (SELECT *
FROM (SELECT TSL.*,
row_number() over(partition by TSL.SYSTEM_ID, TSL.EXECUTE_DAY ORDER BY TSL.CREATE_DATE DESC) AS ROW_NUM
FROM TB_LOG TSL
-- WHERE 这里省略若干条件...
)
WHERE ROW_NUM = 1) T1,
TB_INFO T2
WHERE T1.SYS_SEQ_NO = T2.SEQ_NO) T3,
TB_TYPE T4
where T4.SEQ_NO = T3.MONITOR_TYPE_ID
-- 这里也省略若干条件...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 数据库
相关文章推荐