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

来源:互联网 发布:银联数据 编辑:程序博客网 时间:2024/05/16 11:40

整理需求

笔者的业务理解能力一般,需求按照我的理解转化为数据库逻辑之后大致这个样子的:查询出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-- 这里也省略若干条件...