서브쿼리 개선 0 2 6,419

by 트집이 [Oracle 기초] oracle plsql subquery [2023.04.22 14:54:44]


WITH T AS (	
	SELECT 2023 Y, 1 M, 1 W, 7 VV FROM DUAL 
	UNION ALL
	SELECT 2023, 1, 2, 8 FROM DUAL
	UNION ALL
	SELECT 2023, 1, 3, 9 FROM DUAL
	UNION ALL
	SELECT 2023, 1, 4, 6 FROM DUAL
	UNION ALL
	SELECT 2023, 1, 5, 10 FROM DUAL
	UNION ALL
	SELECT 2023, 2, 6, 11 FROM DUAL
	UNION ALL
	SELECT 2023, 2, 7, 5 FROM DUAL
	UNION ALL
	SELECT 2023, 2, 8, 11 FROM DUAL
	UNION ALL
	SELECT 2023, 2, 9, 9 FROM DUAL
	UNION ALL
	SELECT 2023, 3, 10, 10 FROM DUAL
) 
SELECT Y, M, W, VV
FROM T
WHERE W IN (
			SELECT MAX(W)
			FROM T
			GROUP BY Y, M
);

위의 쿼리를 좀 더 개선 할 수 있을까요?

같은 테이블을 두번 접근 하게 되는데 저 방법 외에 좀 더 좋은 방법이 있을 것 같아서요.

감사합니다.

by 김영군 [2023.04.22 21:17:55]

위의 쿼리구조는 전 보통 인덱스 조합으로 개선합니다. 데이터가 많다는 가정하에요~


by 마농 [2023.04.24 08:44:00]
-- 1. ROW_NUMBER
SELECT *
  FROM (SELECT y, m, w, vv
             , ROW_NUMBER() OVER(PARTITION BY y, m ORDER BY w DESC) rn
          FROM t
        )
 WHERE rn = 1
;
-- 2. KEEP(DENSE_RANK
SELECT y
     , m
     , MAX(w) w
     , MAX(vv) KEEP(DENSE_RANK LAST ORDER BY w) vv
  FROM t
 GROUP BY y, m
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입