그룹별 순별 설정 문의 드립니다. 1 6 822

by 동동동 [SQL Query] [2020.12.23 12:44:33]


안녕하세요..그룹별 순별을 설정하는데 일자에 존재 여부까지 비교를 해서 순번을 주려고 하는데요..

WITH TMP AS (
SELECT '11111' NUM, 'AA' COD, '20201220121000' DTE FROM DUAL UNION ALL
SELECT '11111' NUM, 'BB' COD, '20201220121000' DTE FROM DUAL UNION ALL
SELECT '22222' NUM, 'AA' COD, '20201220170000' DTE FROM DUAL UNION ALL
SELECT '22222' NUM, 'BB' COD, '20201220170000' DTE FROM DUAL UNION ALL
SELECT '22222' NUM, 'CC' COD, '20201220170000' DTE FROM DUAL UNION ALL
SELECT '22222' NUM, 'DD' COD, '20201220170000' DTE FROM DUAL UNION ALL
SELECT '33333' NUM, 'EE' COD, '20201223100000' DTE FROM DUAL UNION ALL
SELECT '33333' NUM, 'FF' COD, '20201223100000' DTE FROM DUAL UNION ALL
SELECT '44444' NUM, 'GG' COD, '20201223150000' DTE FROM DUAL UNION ALL
SELECT '44444' NUM, 'HH' COD, '20201223150000' DTE FROM DUAL
)
SELECT DENSE_RANK() OVER (PARTITION BY SUBSTR(DTE, 1, 8) ORDER BY DTE) AS RNK
     , DENSE_RANK() OVER (PARTITION BY SUBSTR(DTE, 1, 8), COD ORDER BY DTE) AS RNK2
     , SUBSTR(DTE, 1, 8) DTE2
     , TMP.* 
  FROM TMP
ORDER BY DTE, COD;

다음과 같이 데이터가 있을때..

AA, BB가 20일에 12시에 한번 나오고 17시에 다른것과 같이 나왔을경우 두번째 나온 것들은 전부 2로 나오고요..

GG, HH인 경우에는 23일에 나온적이 없기 때문에 1로 나오게 해야 하는데요..

[원본]

RNK RNK2 DTE2 NUM COD DTE
1 1 20201220 11111 AA 20201220121000
1 1 20201220 11111 BB 20201220121000
2 2 20201220 22222 AA 20201220170000
2 2 20201220 22222 BB 20201220170000
2 1 20201220 22222 CC 20201220170000
2 1 20201220 22222 DD 20201220170000
1 1 20201223 33333 EE 20201223100000
1 1 20201223 33333 FF 20201223100000
2 1 20201223 44444 GG 20201223150000
2 1 20201223 44444 HH 20201223150000

 

[원하는 결과]

RNK DTE2 NUM COD DTE
1 20201220 11111 AA 20201220121000
1 20201220 11111 BB 20201220121000
2 20201220 22222 AA 20201220170000
2 20201220 22222 BB 20201220170000
2 20201220 22222 CC 20201220170000
2 20201220 22222 DD 20201220170000
1 20201223 33333 EE 20201223100000
1 20201223 33333 FF 20201223100000
1 20201223 44444 GG 20201223150000
1 20201223 44444 HH 20201223150000

 

다시한번 Select로 감싸지 않고 다음과 같이 결과가 나오게 하고 싶은데 잘 안되네요...도움부탁드립니다..

 

 

by 마농 [2020.12.23 13:26:05]

제시된 예제와 설명 만으로는 규칙이 명확하지 않아 보입니다.
좀 더 명확한 설명이나, 좀 더 복잡한 예시는 없나요?
현재 결과에는 맞게 만들어는 봤는데. 맞는 건지는 모르겠네요.
 

WITH tmp AS
(
SELECT '11111' num, 'AA' cod, '20201220121000' dte FROM dual
UNION ALL SELECT '11111', 'BB', '20201220121000' FROM dual
UNION ALL SELECT '22222', 'AA', '20201220170000' FROM dual
UNION ALL SELECT '22222', 'BB', '20201220170000' FROM dual
UNION ALL SELECT '22222', 'CC', '20201220170000' FROM dual
UNION ALL SELECT '22222', 'DD', '20201220170000' FROM dual
UNION ALL SELECT '33333', 'EE', '20201223100000' FROM dual
UNION ALL SELECT '33333', 'FF', '20201223100000' FROM dual
UNION ALL SELECT '44444', 'GG', '20201223150000' FROM dual
UNION ALL SELECT '44444', 'HH', '20201223150000' FROM dual
)
SELECT dt
     , num, cod, dte
     , MAX(rn) OVER(PARTITION BY dt, dte) rnk
  FROM (SELECT SUBSTR(dte, 1, 8) dt
             , num, cod, dte
             , ROW_NUMBER() OVER(PARTITION BY SUBSTR(dte, 1, 8), cod ORDER BY dte) rn
          FROM tmp
        )
;

 


by 동동동 [2020.12.23 13:48:52]

예..마농님 알려주신 결과가 맞습니다..

그런데 SELECT로 다시한번 깜싸지 않고 해보려고 하는데 안되서요..

 

답변 감사드립니다..^^

 


by 마농 [2020.12.23 13:55:23]

결과가 맞는지가 중요한게 아니라, 과정이 맞는지가 중요합니다.
과정이 틀려도 결과는 어쩌다 보니 운이 좋아(?) 맞을 수도 있습니다.


by 동동동 [2020.12.23 14:35:08]

예..마농님..

DTE와 COD에 대해 순번을 주는건데..해당 순번은 NUM별 COD가 가진 Max값으로 설정하고 싶은 겁니다..

그래서 NUM = 11111 이고 COD가 AA, BB 는 1로 NUM=22222는 AA,BB가 NUM=11111 에 존재하기 때문에 전부 2로..

 


by 마농 [2020.12.23 15:04:28]

서브쿼리를 사용하지 말아야 한다는 제약을 주지 마세요.
목적만 정하고 방법이나 절차에 제약을 두지는 마세요.
굳이 제약을 준다면? 어떻게 하면 좀 더 효율적이고 간결하게 작성할 수 있을까? 정도만 생각하세요.


by 동동동 [2020.12.23 15:12:29]

옙..마농님 조언 감사드립니다..^^

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