안녕하세요..그룹별 순별을 설정하는데 일자에 존재 여부까지 비교를 해서 순번을 주려고 하는데요..
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로 감싸지 않고 다음과 같이 결과가 나오게 하고 싶은데 잘 안되네요...도움부탁드립니다..
제시된 예제와 설명 만으로는 규칙이 명확하지 않아 보입니다.
좀 더 명확한 설명이나, 좀 더 복잡한 예시는 없나요?
현재 결과에는 맞게 만들어는 봤는데. 맞는 건지는 모르겠네요.
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 ) ;