안녕하세요...적용기간 이력에 벗어난 자료를 찾으려고 하는데요..
WITH MST AS ( /* 적용기간 이력 */
SELECT 'AAA' CD, '20220101' STR_DY, '20220131' END_DY FROM DUAL UNION ALL
SELECT 'AAA' CD, '20220301' STR_DY, '20220331' END_DY FROM DUAL UNION ALL
SELECT 'AAA' CD, '20220401' STR_DY, '20220430' END_DY FROM DUAL
)
, LST AS (
SELECT 'AAA' CD, '20211220' DY FROM DUAL UNION ALL /* 적용기간에 벗어남 */
SELECT 'AAA' CD, '20220118' DY FROM DUAL UNION ALL
SELECT 'AAA' CD, '20220220' DY FROM DUAL UNION ALL /* 적용기간에 벗어남 */
SELECT 'AAA' CD, '20220415' DY FROM DUAL UNION ALL
SELECT 'AAA' CD, '20220501' DY FROM DUAL /* 적용기간에 벗어남 */
)
SELECT * FROM (
SELECT MAX(MST.MST_CNT) MST_CNT
, LST.CD
--, MST.STR_DY
--, MST.END_DY
, LST.DY
, SUM(CASE WHEN LST.DY BETWEEN MST.STR_DY AND MST.END_DY THEN
0
ELSE 1
END) VALID_CNT
FROM (SELECT COUNT(CD) OVER(PARTITION BY CD) MST_CNT, CD, STR_DY, END_DY FROM MST) MST
, LST
WHERE LST.CD = MST.CD
GROUP BY LST.CD, LST.DY
)
WHERE MST_CNT = VALID_CNT;
이렇게 해봤는데 좀더 좋은 방법 있을까요??
SELECT T1.* FROM LST T1 LEFT OUTER JOIN MST T2 ON T1.CD = T2.CD AND T1.DY BETWEEN T2.STR_DY AND T2.END_DY WHERE T2.CD IS NULL
더 좋은 방법인지는 모르겠지만 이런 식으로도 도출이 될듯 합니다.
와우...답변감사드립니다...아웃터 조인이 있었군요..ㅠㅠ
감사합니다...^^