🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔍 문제 요약
- 입양 간 동물 중, 보호 기간이 길었던 동물 두마리를 출력하라
- 아이디와 이름을 출력
- 보호 기간이 긴 순으로 조회
✍️ 문제 풀이
처음 풀이는 이렇게 풀었는데...
SELECT ANIMAL_ID, NAME
FROM (SELECT O.ANIMAL_ID, O.NAME,
DATEDIFF(I.DATETIME, O.DATETIME) AS DATE
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
) AS R
ORDER BY DATE DESC
결과가 틀렸다고 나왔다,,, 😢
뭐가 문제인지 몰라서 찾아보았다
⚠️ 문제점
- SQL에서 DATE는 예약어이기 때문에 사용하면 오류가 발생함
-> AS DATE를 DURATION으로 변경해줌 - DATEDIFF('A', 'B')를 사용하면 A - B 가 되는데 현재 코드를 보면
DATEDIFF(I.DATETIME, O.DATETIME)로 보호 시작일 - 입양 시작일을 하고 있다.
결과값이 화면과 같이 음수가 나옴
보호 기간을 구하기 위해서는 입양 시작일 - 보호 시작일을 해야 함
-> DATEDIFF(O.DATETIME, I.DATETIME) 으로 변경
- LIMIT 조건을 붙여줘야 함
(문제 제대로 안 읽음)
LIMIT 2를 붙여줘야 정답이라고 뜬다
최종 코드
SELECT ANIMAL_ID, NAME
FROM (SELECT O.ANIMAL_ID, O.NAME,
DATEDIFF(O.DATETIME, I.DATETIME) AS DURATION
FROM ANIMAL_INS I INNER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
) AS R
ORDER BY DURATION DESC
LIMIT 2
어려운 문제는 아니었지만 실수를 많이 하는 거 같다,, 기본적인 것부터 공부 다시 해야할 거 같다
+ 다른 사람 코드 참조
- RANK() 함수 사용
SELECT ANIMAL_ID, NAME FROM ( SELECT O.ANIMAL_ID, O.NAME, RANK() OVER(ORDER BY O.DATETIME - I.DATETIME DESC) AS DURATION FROM ANIMAL_INS I, ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY DURATION ) a WHERE DURATION IN (1,2)
아직 RANK 함수에 익숙하지 않아서 이걸 쓸 생각을 못했다😢
SQL 공부 열심히 해야겠다,,
'SQL > MySQL' 카테고리의 다른 글
프로그래머스 LV1. 중성화 여부 파악하기, 다양한 코드 구현 방법 (0) | 2025.04.07 |
---|---|
[MySQL] HackerRank - Ollivander's Inventory 문제 풀이 (0) | 2025.03.26 |
[MySQL] HackerRank - The Report 문제 풀이 (0) | 2025.03.24 |
[MySQL] HackerRank - Weather Observation Station 20 문제 풀이 (0) | 2025.03.19 |
[MySQL] HackerRank - Top Competitors 문제 풀이 (0) | 2025.03.13 |