우선 원본 쿼리의 조건절 비효율부터 고쳐볼께요.
컬럼을 가공하여 조건값과 비교하지 마시고
컬럼은 그대로 둔채 조건값을 가공하여 비교하세요.
- 변경전 : AND SUBSTR(dt_trade, 1, 6) <= '201804'
- 변경후 : AND dt_trade <= '201804' || '32'
SELECT cd_company , cd_finproduct , SUM(CASE WHEN no_docu IS NOT NULL THEN am_matrdm END) sum_matrdm , MAX(CASE WHEN rn = 1 THEN sq_no END) max_sq_no , MAX(dt_trade) dt_trade FROM (SELECT cd_company , cd_finproduct , dt_trade , sq_no , no_docu , am_matrdm , ROW_NUMBER() OVER(PARTITION BY cd_company, cd_finproduct ORDER BY dt_trade DESC, sq_no DESC) rn FROM fi_fundmgt_hst WHERE cd_company = '5000' AND dt_trade <= CONCAT('201804', '32') ) a GROUP BY cd_company, cd_finproduct ;