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;
'Code Kata > [SQL] Code Kata' 카테고리의 다른 글
[SQL] 프로그래머스 Lv.4 입양 시각 구하기(2) (1) | 2024.02.20 |
---|---|
[SQL] 프로그래머스 Lv.3 조건에 맞는 사용자 정보 조회하기 (0) | 2024.01.24 |
[SQL] 프로그래머스 Lv.2 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.01.10 |
[SQL] 프로그래머스 Lv.2 입양 시각 구하기(1) (0) | 2024.01.10 |
[SQL] 프로그래머스 Lv.1 조건에 맞는 회원수 구하기 (0) | 2024.01.10 |