https://programmers.co.kr/learn/courses/30/lessons/59411
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 쓰니까 속이 다 시원하다....
'SQL' 카테고리의 다른 글
[ORACLE] 프로그래머스 헤비 유저가 소유한 장소 (+ MySQL) (0) | 2021.05.30 |
---|---|
[ORACLE] 프로그래머스 보호소에서 중성화한 동물 (0) | 2021.05.27 |
[ORACLE] 프로그래머스 중성화 여부 파악하기 (0) | 2021.05.27 |
[ORACLE] 프로그래머스 이름에 el이 들어가는 동물 찾기 (0) | 2021.05.27 |
[ORACLE] 프로그래머스 루시와 엘라 찾기 (0) | 2021.05.27 |