본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 상위 n개 레코드(SELECT)

by gwon_s 2026. 4. 15.

👇 상위 n개 레코드

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔓 문제 설명

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

 

예시 문제 데이터(ANIMAL_INS)

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A399552 Dog 2013-10-14 15:38:00 Normal Jack Neutered Male
A379998 Dog 2013-10-23 11:42:00 Normal Disciple Intact Male
A370852 Dog 2013-11-03 15:04:00 Normal Katie Spayed Female
A403564 Dog 2013-11-18 17:03:00 Normal Anna Spayed Female

 


⚡SQL Query

전통적인 방식(ROWNUM)

SELECT NAME
FROM (
    SELECT NAME
    FROM ANIMAL_INS
    ORDER BY DATETIME ASC
)
WHERE ROWNUM = 1;

 

서브쿼리를 이용한 다른 풀이(MIN)

SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME)
                  FROM ANIMAL_INS);

 

OFFSET 페이징 처리 풀이

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

🔎 풀이 설명

1. 정렬: 가장 먼저 들어온 동물을 찾아야 하므로 날짜를 기준으로 오름차순으로 정렬합니다.

2. 개수 제한: 정렬된 결과 중 가장 상위에 있는 한 건의 데이터만 가져옵니다.


💡인사이트

1. Top-N Stop

  • 인덱스가 존재할 시 DB는 전체를 정렬하지 않고, 인덱스의 가장 첫 번째 리프 블록을 읽자마자 1건을 찾고 바로 스캔을 멈춥니다.

2. 페이징 처리 방식 비교

  • ROWNUM & FETCH 방식
    • 인덱스가 있다면 성능이 우수합니다. 하지만 뒤쪽 페이지로 갈수록 느려집니다. 
    • 결과는 10건이라도 DB는 인덱스를 따라 출력하고자하는 블록까지 건너뛰지 않고 일일이 접근합니다. 
  • RowID 방식
    • Table Access By Index ROWID 횟수를 획기적으로 줄입니다.
    • 인덱스만 읽어서 ROWID만 챙긴 후 필요한 데이터에 대해서만 접근하기에 부하가 적습니다.