전체/Oracle
ORACLE 컬럼 중복값 제거(필터) 방법 정리
effortDev
2017. 11. 22. 11:00
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의 여러 함수를 사용해 컬럼의 중복되는 값 을 제거 할 수 있는 것을 확인했다.