본문 바로가기

Code Kata/[SQL] Code Kata

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

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;