[Oracle] 동명이인 찾는 방법 (이름, 생년월일)

오라클에서 동명이인을 찾기 위해서는 분석함수(OVER 절)를 사용하거나 GROUP BY ~ HAVING 절을 사용할 수 있다. 그 외에도 서브 쿼리 등을 활용할 수 있겠지만 분석함수를 사용하는 것이 가장 효율적인 듯하다. 동명이인은 동일한 이름이 여러 건 조회되었을 경우일 수도 있고, 동일한 이름이 여러 건 조회되고 동일한 이름 내에서 생년월일 등 추가로 식별할 수 있는 조건이 다를 경우 동명이인이라고 판단할 수 있다.

 

목차
  1. 이름만으로 동명이인 찾기
  2. 이름 + 생년월일로 동명이인 찾기
  3. 동명이인 여부를 Y, N으로 표시하기
  4. GROUP BY ~ HAVING으로 동명이인 찾기

 

이름만으로 동명이인 찾기

WITH emp_t(ename, birthdate, job) AS (
  SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
  SELECT '스미스', '1987-04-19', 'CLERK'    FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'CLERK'    FROM dual UNION ALL
  SELECT '클라크', '1981-06-09', 'MANAGER'  FROM dual
)

SELECT ename
     , birthdate
     , job
     , COUNT(*) OVER(PARTITION BY ename) AS sname_cnt
  FROM emp_t

 

 

분석함수(OVER 절)를 사용하면 조회된 내역에서 다시 한번 집계를 할 수 있다.

동일한 이름이 두 번 이상 조회된 건수가 있으면 동명이인으로 판단할 수 있다.

 

조금 더 정확한 동명이인을 체크하기 위해서는 생년월일까지 포함해서 건수를 집계해야 한다.

 

이름 + 생년월일로 동명이인 찾기

WITH emp_t(ename, birthdate, job) AS (
  SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
  SELECT '스미스', '1987-04-19', 'CLERK'    FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'CLERK'    FROM dual UNION ALL
  SELECT '클라크', '1981-06-09', 'MANAGER'  FROM dual
)

SELECT ename
     , birthdate
     , job
     , COUNT(DISTINCT birthdate) OVER(PARTITION BY ename) AS sname_cnt
  FROM emp_t

 

 

동일한 이름 내에서 중복을 제거한(DISTINCT) 생년월일 건수를 집계하였다.

이름이 동일하고 서로 다른 생년월일 건수가 두 건 이상이면 동명이인으로 판단할 수 있다.

 

"제임스"는 두 건이 조회되었지만 생년월일이 동일하므로 동일인으로 판단한다.

 

동명이인 여부를 Y, N으로 표시하기

WITH emp_t(ename, birthdate, job) AS (
  SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
  SELECT '스미스', '1987-04-19', 'CLERK'    FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'CLERK'    FROM dual UNION ALL
  SELECT '클라크', '1981-06-09', 'MANAGER'  FROM dual
)

SELECT ename
     , birthdate
     , job
     , DECODE( COUNT(DISTINCT birthdate) OVER(PARTITION BY ename)
             , 1, 'N', 'Y' ) AS sname_yn
  FROM emp_t

 

 

DECODE 함수를 사용하여 1건이면 'N'으로 그 외에는 'Y'로 표시하였다.

 

GROUP BY ~ HAVING으로 동명이인 찾기

WITH emp_t(ename, birthdate, job) AS (
  SELECT '스미스', '1982-01-23', 'SALESMAN' FROM dual UNION ALL
  SELECT '스미스', '1987-04-19', 'CLERK'    FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'SALESMAN' FROM dual UNION ALL
  SELECT '제임스', '1981-12-03', 'CLERK'    FROM dual UNION ALL
  SELECT '클라크', '1981-06-09', 'MANAGER'  FROM dual
)

SELECT ename
     , COUNT(*) AS sname_cnt
  FROM emp_t
 GROUP BY ename 
HAVING COUNT(DISTINCT birthdate) > 1

 

 

동명이인에 해당하는 사람의 이름만 추출할 때는 GROUP BY 절과 HAVING 절을 활용하면 된다.

동명이인에 해당하는 사람의 이름과 해당 인원 건수를 표시한다.

 

 

[Oracle] 오라클 PARTITION BY 사용법

오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION B

gent.tistory.com

 

[Oracle] 오라클 GROUP BY, HAVING 절 사용법

오라클 SQL에서 GROUP BY 절을 사용하여 그룹별 건수나 합계를 얻을 수 있다. 그룹별 집계된 결과 중 원하는 조건의 결과만 필터링하기 위해서는 HAVING 절을 사용하여 필터 조건을

gent.tistory.com

 

댓글

Designed by JB FACTORY