[ORACLE] 프로그래머스 상위 n개 레코드 (+MySQL)
2021. 3. 11.
반응형

programmers.co.kr/learn/courses/30/lessons/59405

 

코딩테스트 연습 - 상위 n개 레코드

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

1. 서론

 

생각보다 조금 어려웠던 문제.. 주어진 조건 때문에 서브 쿼리를 써야 한다.

 

2. 문제 풀이

 

ANIMAL_INS: 동물 보호소에 들어온 동물의 정보를 담은 테이블

테이블 구조

ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE

(각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부)

 

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

 

가장 먼저 들어온 => datetime

동물의 이름 => name

 

'가장 먼저 들어온'의 의미는 datetime이 가장 작은 값이라는 뜻이다. 그리고 그 값을 가진 동물의 이름을 출력해야 한다.

그래서 나는 서브 쿼리를 썼다. 서브 쿼리에서 min 함수를 써서 datetime의 가장 작은 값을 구하고 그걸 조건절에 넣어 동물의 이름을 구했다.

 

그런데 다르게 푸는 법도 있다. rownum을 쓰는 것이다. rownum은 데이터에 번호를 부여하는 것인데 rownum = 1이라고 하면 한 개의 값만 출력할 수 있다. 이 경우에는 그냥 datetime을 order by로 정렬하고 그중에 첫 번째 값만 (rownum이 1번인) 출력하게 해주는 것이다.

 

참조: chanhuiseok.github.io/posts/db-3/

 

[프로그래머스] 상위 n개 레코드

[프로그래머스] 상위 n개 레코드

chanhuiseok.github.io

 

3. 코드 설명

 

SELECT name 
FROM animal_ins
WHERE datetime IN
(
    SELECT min(datetime)
    FROM animal_ins
);

 

where절에서 서브 쿼리를 건다. in으로 where의 조건은 맞춰주는 것이다. 

조건은 datetime의 최솟값을 구해야 하기 때문에 min함수를 사용했다.

 

+ MySQL

 

SELECT name
FROM animal_ins 
ORDER BY datetime 
LIMIT 1

 

공부하다가 MySQL로 해야 할 일이 있어서 추가!!

rownum이 limit으로 간단하게 대체되는 게 Oracle 보다 오억 배 풀기 편한 듯...

내가 옛날에 걸어놓은 링크 보니까 rownum 쓰려면 서브 쿼리 써야 하는 게 극혐....

 

 

반응형
myoskin