MySQL에서 특정 열(column)의 n번째로 높은 값을 구하고 싶다면 LIMIT와 OFFSET을 함께 사용하면 됩니다. 핵심 아이디어는 간단합니다. 값을 내림차순으로 정렬한 뒤, OFFSET으로 앞의 값들을 건너뛰고 원하는 순번의 값 하나만 가져오는 것입니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
Value int
);
Query OK, 0 rows affected (0.49 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(100); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(140); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable values(80); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(89); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(98); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(58); Query OK, 1 row affected (0.10 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 100 | | 140 | | 90 | | 80 | | 89 | | 98 | | 58 | +-------+ 7 rows in set (0.00 sec)
4. n번째로 높은 값 조회 쿼리
이제 본론입니다. 아래 쿼리는 ORDER BY로 값을 정렬한 후 OFFSET 3을 사용해 상위 3개의 값을 건너뛰고, 그 다음 값 1개만 가져옵니다. 즉, 4번째로 높은 값을 구하는 쿼리입니다.
mysql> select Value from DemoTable
order by Value limit 1 offset 3;실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 90 | +-------+ 1 row in set (0.00 sec)
동작 원리 정리
이 방식의 원리를 공식처럼 정리하면 다음과 같습니다.
ORDER BY Value DESC: 값을 큰 순서대로 정렬합니다.LIMIT 1: 최종적으로 한 개의 행만 반환합니다.OFFSET N: 정렬된 결과에서 앞의 N개 행을 건너뜁니다.
따라서 OFFSET (n-1)을 지정하면 n번째로 높은 값을 얻을 수 있습니다. 예를 들어 두 번째로 높은 값이 필요하면 OFFSET 1, 세 번째라면 OFFSET 2를 사용하면 됩니다.
참고: 중복 값 처리 주의사항
이 방법은 중복된 값도 하나의 순위로 계산한다는 점에 유의해야 합니다. 예를 들어 데이터에 140이 두 번 있다면, 두 번째로 높은 '고유한 값'을 구하고 싶을 때는 DISTINCT를 함께 사용하는 것이 좋습니다.
select DISTINCT Value from DemoTable
order by Value desc limit 1 offset 1;이처럼 LIMIT ... OFFSET ... 조합은 서브쿼리 없이도 간단하게 n번째 최댓값을 구할 수 있는 실용적인 방법입니다.