[ORACLE] 프로그래머스 오랜 기간 보호한 동물(2) (+MySQL)
2021. 5. 27.
반응형

https://programmers.co.kr/learn/courses/30/lessons/59411

 

코딩테스트 연습 - 오랜 기간 보호한 동물(2)

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

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

 

ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

테이블 구조:

ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

(각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부)

 

Q. 입양을 동물 , 보호 기간이 가장 길었던 동물 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 순으로 조회해야 합니다.

 

두 시간을 비교하는 게 관건인 문제였다. 시간을 어떻게 계산하냐가 포인트이다. 처음에는 to_date(a.datetime, 'yyyy-mm-dd') 이러고 있었는데 그냥 단순하게 a.datetime- b.datetime 해도 계산이 됐다.... 난 그것도 모르고 어떻게 해야 하는지 한참 고민하다가 힌트를 살짝 보고 풀었다....

 

3. 코드 설명

 

SELECT animal_id, name
FROM (
    SELECT a.animal_id, a.name
    FROM animal_ins a, animal_outs b
    WHERE a.animal_id = b.animal_id
    ORDER BY b.datetime - a.datetime desc
    )
WHERE rownum <= 2;

 

b테이블은 입양을 간 것이 기준, a 테이블은 처음 보호소에 들어왔을 때가 기준이기 때문에 b.datetime에서 a.datetime을 빼줬다.

이것이 '보호기간이 긴 순'으로 정렬하는 방법이다. 긴 것이 위로 와야 하기 때문에 desc을 써줬다.

같은 동물의 시간을 비교해야 하기 때문에 where에서 두 테이블의 동물의 id가 같을 경우로 고정해줬다. 

그리고 정렬 결과 중에 가장 길었던 동물 단 두 마리만 출력해야 했기 때문에 rownum을 이용했다.

서브 쿼리를 쓴 이유는 정렬이 다 되고 나서 rownum을 이용하려고

 

 

+MySQL

 

SELECT a.animal_id, a.name
FROM animal_ins a, animal_outs b
WHERE a.animal_id = b.animal_id
ORDER BY a.datetime - b.datetime
LIMIT 2

 

훨씬 간결하네...

보호기간이 긴 순이니까 보호기관에 들어간 시간 - 동물 보호소에 들어간 시간을 하면 동물 보호소에 들어갔던 시간부터 보호기관으로 입양가기까지의 기간을 구할 수 있다. (시간은 후순위가 큰 것이므로)

rownum만 쓰다가 LIMIT 쓰니까 속이 다 시원하다....

 

 

 

반응형
myoskin