본문 바로가기
Study/database

row_number()의 사용법

by 아방 2007. 8. 28.

SELECT COUNT(*)
FROM BS_LOT A,
  ( SELECT * FROM
        ( SELECT
      BDD_ID,
    BDD_TYPE,
    LOT_MGT_NO,
    AMT_MGT_NO,
   
      ROW_NUMBER() OVER( PARTITION BY BDD_ID, BDD_TYPE, LOT_MGT_NO ORDER BY BDD_ID, BDD_TYPE, LOT_MGT_NO) RNK

-- partition by 안에 포함될 그룹을 넣어놓고 order by로 정렬 시키고
-- rnk =1의 값은  각각의 최상위값 오름 차순일땐 가장 높은 값이 들어가 있다..
-- max 함수를 썼을때와 비슷한 효과를 가져온다

      FROM BS_AMT A) WHERE RNK=1) B
  WHERE A.BDD_ID = B.BDD_ID(+)
  AND A.BDD_TYPE = B.BDD_TYPE(+)
  AND A.LOT_MGT_NO = B.LOT_MGT_NO(+)
 
 AND A.COFR_YN = 'Y' 
 AND A.BDD_ID = '00440' 
 AND A.BDD_TYPE = '0' 
 AND A.MNT_LOT_YN = DECODE('','','N', '') 
 AND A.COFR_YN = 'Y'




코드 비교
- row_number 이용한 경우 -

SELECT
  count(*)
 FROM   BS_LOT BL, CM_GVT_BLOCK CGB,
 (SELECT * FROM
        ( SELECT
      BDD_ID,
    BDD_TYPE,
    LOT_MGT_NO,
    AMT_MGT_NO,
   
      ROW_NUMBER() OVER( PARTITION BY BDD_ID, BDD_TYPE, LOT_MGT_NO ORDER BY BDD_ID, BDD_TYPE, LOT_MGT_NO) RNK
      FROM BS_AMT A) WHERE RNK=1
   
 )  BA
 WHERE BA.BDD_ID(+) = BL.BDD_ID
 AND   BA.BDD_TYPE(+) = BL.BDD_TYPE
 AND   BA.LOT_MGT_NO(+) = BL.LOT_MGT_NO
 AND   BL.GVT_ID = CGB.GVT_BLOCK_ID

 AND BL.SUPPLY_METH != '50' 
 AND BL.COFR_YN = 'Y' 
 AND BL.BDD_ID = '00440' 
 AND BL.BDD_TYPE = '0' 
 AND BL.MNT_LOT_YN = DECODE('','','N', '') 
 AND BL.COFR_YN = 'Y' 


- max 이용한 경우 -

SELECT
  count(*)
 FROM   BS_LOT BL, CM_GVT_BLOCK CGB,
 (SELECT  *
FROM BS_AMT BA
WHERE  BA.AMT_MGT_NO =(SELECT MAX(AMT_MGT_NO)
           FROM  BS_AMT
        WHERE BDD_ID = BA.BDD_ID
        AND   BDD_TYPE = BA.BDD_TYPE
        AND   LOT_MGT_NO =BA.LOT_MGT_NO
        )
) BA

 WHERE BA.BDD_ID(+) = BL.BDD_ID
 AND   BA.BDD_TYPE(+) = BL.BDD_TYPE
 AND   BA.LOT_MGT_NO(+) = BL.LOT_MGT_NO
 AND   BL.GVT_ID = CGB.GVT_BLOCK_ID

 AND BL.SUPPLY_METH != '50' 
 AND BL.COFR_YN = 'Y' 
 AND BL.BDD_ID = '00440' 
 AND BL.BDD_TYPE = '0' 
 AND BL.MNT_LOT_YN = DECODE('','','N', '') 
 AND BL.COFR_YN = 'Y' 
      

댓글