sql 逻辑 ORACLE优化

1.查最新

有2个站点 CR_OPE_ID_FK  IN  ('M310','M330'),查询A站点NG的PRD_SEQ_ID,并显示2个站点同ID的最新状况(如果也是NG)


SELECT 
    CR_OPE_ID_FK,
    MDL_ID_FK,
    WO_ID_FK,
    PRD_SEQ_ID,
    substr(PRD_GRADE,1,1) PRD_GRADE_GP,
    PRD_GRADE,
    EVT_CATE,
    LOGOF_USR,
    EXT_9,
    EVT_TIMESTAMP
FROM HIS_RET_PRD_INFO  
WHERE 
    (PRD_SEQ_ID,CR_OPE_ID_FK,EVT_TIMESTAMP) IN (
	SELECT PRD_SEQ_ID,CR_OPE_ID_FK,MAX(EVT_TIMESTAMP)--查询 M330 NG的ID对应的M330和310所有的最新的信息  
	FROM HIS_RET_PRD_INFO
	WHERE PRD_SEQ_ID IN (
		SELECT PRD_SEQ_ID--查询 最新的ID和时间里,EXT_9=NG的信息
		FROM HIS_RET_PRD_INFO 
		WHERE 
                    (PRD_SEQ_ID,EVT_TIMESTAMP)IN 
			(
			SELECT  PRD_SEQ_ID,MAX(EVT_TIMESTAMP)--输入站点,查询最新的ID和时间
			FROM HIS_RET_PRD_INFO 
    		        WHERE CR_OPE_ID_FK='M330'
            	            AND EVT_TIMESTAMP >= to_date('2018-01-04 08:30:00','yyyy-mm-dd hh24:mi:ss') 
            	            AND EVT_TIMESTAMP < to_date('2018-01-05 08:30:00','yyyy-mm-dd hh24:mi:ss') 
            	            AND EVT_CATE='LGOF'
            	            AND MDL_ID_FK='G1548FH111GG-001'
            	            AND WO_ID_FK='3000575'
            	        GROUP BY PRD_SEQ_ID
			)
                    AND EXT_9='NG'
	)
	    AND CR_OPE_ID_FK IN ('M310','M330')
	    AND EVT_TIMESTAMP >= to_date('2018-01-04 08:30:00','yyyy-mm-dd hh24:mi:ss') 
	    AND EVT_TIMESTAMP < to_date('2018-01-05 08:30:00','yyyy-mm-dd hh24:mi:ss') 
	    AND EVT_CATE='LGOF'
	    AND MDL_ID_FK='G1548FH111GG-001'
	    AND WO_ID_FK='3000575'
	GROUP BY PRD_SEQ_ID,CR_OPE_ID_FK
)
AND EXT_9='NG'

2.分组查最新

SELECT  ID,NAME,TYPE,TIME 
FROM (
    SELECT  ID,NAME,TYPE,TIME,ROW_NUMBER()
    OVER(PARTITION BY TYPE ORDER BY TIME) AS code_id
    FROM HIS_RET_PRD_INFO 
    WHERE NAME LIKE '%A'
)WHERE code_id =1

误区:这里是先进行WHERE条件,再排序取最新。


3.ORACLE 优化 利用lag(),lead()函数

原SQL:要查2次表

SELECT PRD_SEQ_ID
FROM HIS_RET_PRD_INFO 
WHERE (PRD_SEQ_ID,EVT_TIMESTAMP)IN 
(
	SELECT  PRD_SEQ_ID,MAX(EVT_TIMESTAMP)
	FROM HIS_RET_PRD_INFO 
    WHERE EVT_TIMESTAMP >= to_date('2018-01-04 08:30:00','yyyy-mm-dd hh24:mi:ss') 
    AND EVT_TIMESTAMP < to_date('2018-01-05 08:30:00','yyyy-mm-dd hh24:mi:ss') 
    and CR_OPE_ID_FK IN ('M330')
    AND EVT_CATE='LGOF'
    and MDL_ID_FK IN ('G1548FH111GG-001')
    and WO_ID_FK IN ('3000575')
    GROUP BY PRD_SEQ_ID
)
and EXT_9 IN ('NG')
利用lag(),lead()函数分析,效率上也有优化

SELECT PRD_SEQ_ID FROM (
	SELECT 
		PRD_SEQ_ID,EXT_9, 
        LAG(EXT_9,1,0) OVER(partition BY PRD_SEQ_ID ORDER BY EVT_TIMESTAMP DESC) MAX_VALUE,
        EVT_TIMESTAMP,
        LEAD(EXT_9,1,0)  OVER(partition BY PRD_SEQ_ID ORDER BY EVT_TIMESTAMP DESC) MIN_VALUE
   	FROM HIS_RET_PRD_INFO 
    	WHERE EVT_TIMESTAMP >= to_date('2018-01-04 08:30:00','yyyy-mm-dd hh24:mi:ss') 
        AND EVT_TIMESTAMP < to_date('2018-01-05 08:30:00','yyyy-mm-dd hh24:mi:ss') 
        and CR_OPE_ID_FK IN ('M330')
        AND EVT_CATE='LGOF'
        and MDL_ID_FK IN ('G1548FH111GG-001')
        and WO_ID_FK IN ('3000575')
)WHERE MAX_VALUE='0' AND EXT_9='NG'
partition 类似 group by 先分组后排序。

max_value='0'代表他是分组排序中的第一个,min_value='0'代表他是分组排序中的最后一个,不为0是,显示的是他上一位的EXT_9




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值