적용기간 이력에 벗어난 자료 찾기 0 2 3,756

by 동동동 [SQL Query] oracle sql [2022.04.14 12:48:20]


안녕하세요...적용기간 이력에 벗어난 자료를 찾으려고 하는데요..

 

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;

 

이렇게 해봤는데 좀더 좋은 방법 있을까요??

by 우주민 [2022.04.14 13:30:31]
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

더 좋은 방법인지는 모르겠지만 이런 식으로도 도출이 될듯 합니다.


by 동동동 [2022.04.14 13:40:43]

와우...답변감사드립니다...아웃터 조인이 있었군요..ㅠㅠ

감사합니다...^^

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