오라클 Oracle 근사치(근삿값)를 찾는 방법 2가지

오라클 테이블의 숫자 컬럼에서 찾고자 하는 숫자와 가장 가까운 근삿값을 SELECT 하려면 어떻게 쿼리 문을 작성하면 될까요?

일반적으로 SQL 문에서 WHERE 조건 절의 일치하는 값 또는 범위에 해당하는 값을 가져오게 됩니다.

이전 포스팅 글에서 SELECT 해서 INSERT 방법 중에 중복 INSERT 방지하며 INSERT 하는 방법 설명에서 ROW_NUMBER 내장 함수에 대해 설명한 적이 있습니다.([MSSQL, MySQL, Oracle] SELECT 해서 INSERT 방법(중복 INSERT 방지) 참조)

그리고 MSSQL 그룹별 최상위 데이터 또는 최신 데이터 하나씩만 가져오는 방법(OVER 사용) 포스팅에서 ROW_NUMBER 함수와 RANK 함수에 대해 설명한 적이 있습니다.

이번 글에서는 다른 포스팅 글에서 소개한 ROW_NUMBER 함수와 RANK 함수를 사용하여 오라클 Oracle 근사치(근삿값)를 찾는 방법 2가지에 대해 알아보겠습니다.

ROW_NUMBER 함수를 사용하여 근사치(근삿값) 찾는 방법

1. 아래 SQL 문은 pays 테이블에서 사원 번호와 급여를 가져오는 쿼리 문입니다.

SELECT emp_no, payment 
FROM pays WHERE pay_ym=‘202410’
ORDER BY payment

2. 위 쿼리 문에 대한 결과 데이터 입니다.

3. ROW_NUMBER() 함수를 사용하여 급여에서 3,000,000원에 가장 가까운 근사치 값을 가져오는 쿼리 문을 작성해 보겠습니다.

SELECT * 
FROM (
       SELECT emp_no, payment, 
              ROW_NUMBER() OVER(ORDER BY ABS(payment  3000000)) AS row_num 
       FROM pays 
       WHERE pay_ym=‘202410’
     )
WHERE row_num = 1

4. 위 쿼리 문에 대한 실행 결과 가져온 데이터 입니다.

5. 실행 결과를 보면 전체 데이터에서 472행의 2,996,400원을 가져오고 있습니다.
473행의 3,046,800 보다 3,000,000원 더 가까운 근삿값임을 알 수 있습니다.

RANK 함수를 사용하여 근사치(근삿값) 찾는 방법

1. 동일한 테이블 데이터에서 RANK() 함수를 사용하여 근사치 값을 가져오는 쿼리 문을 작성해 보겠습니다.

SELECT * 
FROM (
       SELECT emp_no, payment, 
              RANK() OVER(ORDER BY ABS(payment  3000000)) AS row_num 
       FROM pays 
       WHERE pay_ym=‘202410’
     )
WHERE row_num = 1

2. 위 쿼리 문 실행 결과는 앞 단락에서 설명한 ROW_NUMBER 함수 실행 결과와 동일합니다.

ROW_NUMBER 함수와 RANK 함수의 차이점

ROW_NUMBER 함수와 RANK 함수의 쿼리 문 실행 결과가 동일해 보이지만 결정적으로 한 가지 차이점이 있습니다.

ROW_NUMBER 함수는 근사치가 동일한 값이 여러 건 존재할 경우 한 건의 데이터만 가져옵니다.
반면에 RANK 함수는 근사치가 동일한 값이 여러 건 존재할 경우 동일한 값을 모두 가져옵니다.

동일한 SQL 문에서 근사치 값을 2,980,000원으로 변경했을 때 입니다.

SELECT * 
FROM (
       SELECT emp_no, payment, 
              RANK() OVER(ORDER BY ABS(payment  2980000)) AS row_num 
       FROM pays 
       WHERE pay_ym=‘202410’
     )
WHERE row_num = 1

위 쿼리 문에 대한 실행 결과 입니다.

RANK 함수를 사용했을 경우 2건의 데이터를 가져오는 것을 확인할 수 있습니다.
만약 ROW_NUMBER 함수를 사용했다면 첫 번째 행의 1건만 데이터를 가져오게 됩니다.

마무리

오라클 테이블 데이터에서 근삿값을 가져오기 위해 ROW_NUMBER 함수와 RANK 함수를 사용하는 방법에 대해 알아보았습니다.

동일한 근삿값을 가져오지만 가져오는 데이터 건 수의 차이가 발생하는 것도 간략히 설명하였습니다.

사용하는 목적의 용도에 맞게 ROW_NUMBER 또는 RANK 함수를 사용해서 원하는 결과의 근사치 값을 구하면 될 듯 합니다.

MSSQL, MySQL에서도 참고하시면 됩니다.





이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.

답글 남기기