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

  • Post author:
  • Post category:其他


整理需求

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



版权声明:本文为yangjiegang8原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。