ORACLE 컬럼 중복값 제거(필터) 방법 정리



1. RANK() OVER, DENSE_RANK() OVER, ROW_NUMBER() OVER 함수




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- ORACLE 데이터의 중복 값을 제거(필터)하는 방법
-- RANK() OVER, DENSE_RANK() OVER, ROW_NUMBER() OVER 함수
 
SELECT ID
         , SALARY
         , RANK() OVER (ORDER BY SALARY DESC) RANK_FUNC -- 같은 값 공통 순위 1등이 3명 있다면 다음 순위는 2등이 아닌 4등이 된다.
         , DENSE_RANK() OVER (ORDER BY SALARY DESC) DENSE_RANK_FUNC -- 같은 값 공통 순위 1등이 3명 있다면 다음 순위는 2등이 된다.
         , ROW_NUMBER() OVER (ORDER BY SALARY DESC) ROW_NUMBER_FUNC -- 같은 값 공통 순위 1등이 3명 있다해도 순위가 각각 1,2,3등 매겨진다.
  FROM
         (
            SELECT 1 ID, 2000 SALARY FROM DUAL UNION ALL
            SELECT 2 ID, 2200 SALARY FROM DUAL UNION ALL
            SELECT 3 ID, 2400 SALARY FROM DUAL UNION ALL
            SELECT 4 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 5 ID, 2800 SALARY FROM DUAL UNION ALL
            SELECT 6 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 7 ID, 3000 SALARY FROM DUAL UNION ALL
            SELECT 8 ID, 2600 SALARY FROM DUAL -- 2600 중복
          );
cs


결과



2. ROW_NUMBER() OVER 사용한 SALARY 중복값 제거 - 1




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- ROW_NUMBER() OVER 사용한 SALARY 중복값 제거 - 1
 
SELECT A1.*
  FROM (
            SELECT ID
                     , SALARY
                     , ROW_NUMBER() OVER (PARTITION BY SALARY ORDER BY ID)  AS RN
              FROM
                     (
                        SELECT 1 ID, 2000 SALARY FROM DUAL UNION ALL
                        SELECT 2 ID, 2200 SALARY FROM DUAL UNION ALL
                        SELECT 3 ID, 2400 SALARY FROM DUAL UNION ALL
                        SELECT 4 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
                        SELECT 5 ID, 2800 SALARY FROM DUAL UNION ALL
                        SELECT 6 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
                        SELECT 7 ID, 3000 SALARY FROM DUAL UNION ALL
                        SELECT 8 ID, 2600 SALARY FROM DUAL -- 2600 중복
                      )
           ) A1
WHERE A1.RN = 1
;
cs



결과




3. GROUP BY를 사용한 SALARY 중복값 제거 - 2



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- GROUP BY를 사용한 SALARY 중복값 제거 - 2
 
SELECT MIN(ID)
         , SALARY
  FROM
         (
            SELECT 1 ID, 2000 SALARY FROM DUAL UNION ALL
            SELECT 2 ID, 2200 SALARY FROM DUAL UNION ALL
            SELECT 3 ID, 2400 SALARY FROM DUAL UNION ALL
            SELECT 4 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 5 ID, 2800 SALARY FROM DUAL UNION ALL
            SELECT 6 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 7 ID, 3000 SALARY FROM DUAL UNION ALL
            SELECT 8 ID, 2600 SALARY FROM DUAL -- 2600 중복
          )
GROUP BY SALARY
ORDER BY SALARY
;
cs



결과




4. DISTINCT 를 사용한 SALARY 중복값 제거 - 3




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- DISTINCT 를 사용한 SALARY 중복값 제거 - 3
 
SELECT DISTINCT A1.SALARY
  FROM
         (
            SELECT 1 ID, 2000 SALARY FROM DUAL UNION ALL
            SELECT 2 ID, 2200 SALARY FROM DUAL UNION ALL
            SELECT 3 ID, 2400 SALARY FROM DUAL UNION ALL
            SELECT 4 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 5 ID, 2800 SALARY FROM DUAL UNION ALL
            SELECT 6 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
            SELECT 7 ID, 3000 SALARY FROM DUAL UNION ALL
            SELECT 8 ID, 2600 SALARY FROM DUAL -- 2600 중복
          ) A1
;
cs



결과




5. ROWID 를 사용한 SALARY 중복값 제거 - 4



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- ROWID를 이용한 SALARY 중복값 제거 - 4
 
-- 테이블 만들기 4-1
 
CREATE TABLE MY_DUAL AS(
    SELECT 1 ID, 2000 SALARY FROM DUAL UNION ALL
    SELECT 2 ID, 2200 SALARY FROM DUAL UNION ALL
    SELECT 3 ID, 2400 SALARY FROM DUAL UNION ALL
    SELECT 4 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
    SELECT 5 ID, 2800 SALARY FROM DUAL UNION ALL
    SELECT 6 ID, 2600 SALARY FROM DUAL UNION ALL -- 2600 중복
    SELECT 7 ID, 3000 SALARY FROM DUAL UNION ALL
    SELECT 8 ID, 2600 SALARY FROM DUAL -- 2600 중복
)
;
 
-- 테이블에서 ROWID 이용 중복값 제거 4-2
 
SELECT ID, SALARY
  FROM MY_DUAL
WHERE ROWID IN (SELECT MIN(ROWID)
                              FROM MY_DUAL
                            GROUP BY SALARY)
;
cs



결과




ORACLE의 여러 함수를 사용해 컬럼의 중복되는 값 을 제거 할 수 있는 것을 확인했다.



+ Recent posts