Code Kata/[SQL] Code Kata
[SQL] 프로그래머스 Lv.3 오랜 기간 보호한 동물(1)
sance
2024. 1. 18. 14:43
31. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 LEFT JOIN 후
ANIMAL_OUTS에서 동물 아이디가 NULL인 조건절을 사용하여 입양을 못 간 동물을 필터링해주고
보호 시작일 순으로 정렬해준다.
마지막으로 LIMIT 함수를 사용해 3개의 행만 출력한다.
--MySQL / LIMIT 사용
SELECT i.name, i.datetime
FROM animal_ins i LEFT JOIN animal_outs o ON i.animal_id=o.animal_id
WHERE o.datetime IS NULL
ORDER BY i.datetime
LIMIT 3
RANK 함수를 사용한다면 조건절 서브쿼리를 사용하여 쿼리문을 작성한다.
보호시작일 순으로 정렬하여 상위 3개의 랭킹을 필터링하고 해당하는 결과만 출력한다.
--MySQL / RANK 사용
SELECT i.name, i.datetime
FROM animal_ins i LEFT JOIN animal_outs o ON i.animal_id=o.animal_id
WHERE o.datetime IS NULL
AND (SELECT RANK() OVER(ORDER BY datetime) rk FROM animal_ins HAVING rk<=3)
Oracle에서는 LIMIT 함수와 같이 행의 개수를 제한하는 FETCH FIRST 를 사용하여 3개의 행만 출력한다.
--Oracle / FETCH FIRST 사용
SELECT i.name, i.datetime
FROM animal_ins i LEFT JOIN animal_outs o ON i.animal_id=o.animal_id
WHERE o.animal_id IS NULL
ORDER BY i.datetime
FETCH FIRST 3 ROWS ONLY;
ROWNUM을 사용할 경우 FROM절에 서브쿼리로 묶어준 다음 WHERE 조건절에서 필터링해 준다.
--Oracle / ROWNUM 사용
SELECT name, datetime
FROM
(SELECT i.name, i.datetime
FROM animal_ins i LEFT JOIN animal_outs o ON i.animal_id=o.animal_id
WHERE o.animal_id IS NULL
ORDER BY i.datetime) a
WHERE ROWNUM<=3;