본문 바로가기
코딩테스트/SQL 코테

[프로그래머스 SQL] 오랜 기간 보호한 동물(2)

by 코듀킹 2023. 8. 7.

정답 쿼리

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2;

 

해설

FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID

이 문제는 '입양을 간 동물' 중에 보호 기간이 길었던 동물을 찾는 문제이다. '입양을 간 동물'만 필터링하기 위해서는 입양을 보낸 날짜가 NULL값이 아니어야 한다. 즉, ANIMAL_OUTS의 DATETIME이 결측치가 아니어야 한다. 이는 INNER JOIN을 쓰면, 쉽게 해결할 수 있다. INEER JOIN을 쓰면 들어왔던 날짜와 나갔던 날짜가 모두 결측치가 아닌 동물들만 남게 된다. 참고로 MYSQL에서는 JOIN만 쓰면, INNER JOIN이 된다.

 

ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2;

ORDER BY로 정렬시킨다음 LIMIT 2로 자르면 쉽게 상위 2위까지만 조회할 수 있다. DATEDIFF는 두 날짜 사이의 차이가 며칠이 되는지 계산해 주는 함수이다.

SELECT I.ANIMAL_ID, I.NAME

 

SELECT문은 밑에서 INNER JOIN을 했기 때문에 I.ANIMAL_ID, I.NAME로 조회하든 O.ANIMAL_ID, O.NAME으로 조회하든 어차피 똑같은 결과가 나온다. 

댓글