오라클 테이블의 숫자 컬럼에서 찾고자 하는 숫자와 가장 가까운 근삿값을 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에서도 참고하시면 됩니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
- MS SQL 서버 대용량 DB를 스크립트 생성으로 백업 및 복원하는 방법(SSMS 마이그레이션)
- 데이터베이스 서버(MSSQL, MySql, Oracle)의 현재 날짜와 시간을 가져오는 방법
- 오라클(Oracle) SELECT 문에서 날짜 함수 활용 및 날짜 연산 방법
- Oracle 오라클 테이블 컬럼(Column) 추가, 삭제, 변경 방법(순서 변경)
- 오라클 ORACLE의 SELECT 문에서 출력 되는 Row 수를 제한하는 방법 5가지
- 오라클 ORACLE SELECT 구문의 GROUP BY SUM()에 대한 Total과 Sub Total 추가 방법
♥ 이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.