COUNT(*) OVER(PARTITION BY 사용시 발생되는 문제 0 3 3,269

by MS [SQL Query] [2024.03.15 08:07:07]


feature_count.png (53,873Bytes)

감사합니다.

기존에 도움을 주셔서 잘 사용하고 있었습니다. 그런데 요번 프로젝트에서 feature의 글자수가 다른 경우가 발생해서 아래 첨부한 이미지의 빨간 박스 처럼 문제가 생겼습니다. 혹시 다른 방안이 있을까요?

아래 부분을 실행하면 첨부한 이미지 처럼 값이 나옵니다.

WITH usage AS
(
SELECT 1 no, 'AAEKZ OR AAED3' usage   FROM dual
UNION ALL SELECT 2, 'AAEKZ OR AAED3-TX'  FROM dual
UNION ALL SELECT 3, 'AAEA7 AND KBE00' FROM dual
UNION ALL SELECT 4, 'AAEA7 AND KBE00' FROM dual
)
, model_varaint AS
(
SELECT 'MEST23DRW' modelVariant, 'AAEKZ' feature, 'S' value FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'AAED3', 'O' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'AAED3-TX', 'O' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'AAEA7', 'O' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'KBE00', 'S' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'KBE01', 'S' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'KBE02', '-' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'AAEB5', '-' FROM dual
UNION ALL SELECT 'MEST23DRW'  , 'AAED2', 'S' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'AAEKZ', 'S' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'AAED3', 'S' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'AAEA7', '-' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'KBE00', '-' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'KBE01', 'S' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'KBE02', '-' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'AAEB5', '-' FROM dual
UNION ALL SELECT 'OKLIDDS21AD', 'AAED2', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'AAEKZ', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'AAED3', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'AAEA7', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'KBE00', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'KBE01', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'KBE02', 'S' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'AAEB5', '-' FROM dual
UNION ALL SELECT 'DFR55EW'    , 'AAED2', 'S' FROM dual
)
, mv_code AS    
(
SELECT 1 mv_seq, 'MEST23DRW' modelVariant FROM dual
UNION ALL SELECT 2, 'OKLIDDS21AD' FROM dual
UNION ALL SELECT 3, 'DFR55EW'     FROM dual
)
, tmp1 AS
(
SELECT no, usage
     , modelvariant, feature, value
     , COUNT(*) OVER(PARTITION BY no) cnt
     , ROW_NUMBER() OVER(PARTITION BY no ORDER BY feature) rn
  FROM (SELECT a.no, a.usage
             , b.modelvariant, b.feature, b.value
             , DENSE_RANK() OVER(PARTITION BY b.feature ORDER BY a.no) dr
             , c.mv_seq                        
             , MAX(c.mv_seq) OVER() max_seq    
          FROM usage a
             , model_varaint b
             , mv_code c                       
         WHERE INSTR(a.usage, b.feature) > 0 
           AND b.modelvariant = c.modelvariant 
        )
 WHERE mv_seq = (MOD(dr - 1, max_seq) + 1)     
)
select * from tmp1
;

by 마농 [2024.03.15 09:16:14]

뭐가 문제인가요?
질문이 구체적이지 않아 이전 글 다시 찾아보고 다시 또 분석해야 하네요?
쿼리도 전체 다 올리신게 아니고 중간결과 까지만 올리셨네요?
이전글을 보니 지금 올리신 쿼리 말고 최종 REPLACE 할 때 문제가 발생될 듯 하네요.
AAED3 를 REPLACE 할 때 AAED3-TX 까지 함께 REPLACE 되는 문제일 듯 하네요. 맞나요?
이 문제를 제가 다시 또 힘들게 분석하게 하지 마시고
질문글에 문제점에 대해 확인된 사항을 구체적으로 올려주셨으면 좋았을 텐데요.
이 문제를 해결하려면 AAED3 보다 AAED3-TX 가 먼저 처리되게 하면 되겠네요.

- 변경전 : , ROW_NUMBER() OVER(PARTITION BY no ORDER BY feature) rn
- 변경후 : , ROW_NUMBER() OVER(PARTITION BY no ORDER BY LENGTH(feature) DESC, feature) rn

아래처럼 수정하면 이부분은 수정 안해도 되겠네요.
 


by 마농 [2024.03.15 09:45:45]

아! 하나 더 있네요.
변경 할 때 뿐만 아니라 비교할 때도 문제가 되겠네요.
비교식 수정하면 위에 rn 은 안바꿔도 되겠네요.
- 변경전 : WHERE INSTR(a.usage, b.feature) > 0
- 변경후 : WHERE INSTR(' '||a.usage||' ', ' '||b.feature||' ') > 0
 


by MS [2024.03.15 10:20:06]

감사합니다. 

좀더 명확하게 질문하도록 노력해 보겠습니다. 

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