프로그래머스 풀이

오랜 기간 보호한 동물(1)

Iam_noob 2024. 2. 29. 15:52
728x90
반응형

이 SQL쿼리 문제는 동물 보호소에 들어온 동물 중 보호소를 나간 동물의 기록이 없는 동물들을 오래된 순으로 찾아내라는 문제다.

문제의 주요 포인트로 JOIN이 적혀있었다.

 

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

예시

예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

 

ANIMAL_INS

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A354597 Cat 2014-05-02 12:16:00 Normal Ariel Spayed Female
A373687 Dog 2014-03-20 12:31:00 Normal Rosie Spayed Female
A412697 Dog 2016-01-03 16:25:00 Normal Jackie Neutered Male
A413789 Dog 2016-04-19 13:28:00 Normal Benji Spayed Female
A414198 Dog 2015-01-29 15:01:00 Normal Shelly Spayed Female
A368930 Dog 2014-06-08 13:20:00 Normal   Spayed Female

ANIMAL_OUTS

 

ANIMAL_ID ANIMAL_TYPE DATETIME NAME SEX_UPON_OUTCOME
A354597 Cat 2014-05-02 12:16:00 Ariel Spayed Female
A373687 Dog 2014-03-20 12:31:00 Rosie Spayed Female
A368930 Dog 2014-06-13 15:52:00   Spayed Female

SQL문을 실행하면 다음과 같이 나와야 합니다.

 

NAME DATETIME
Shelly 2015-01-29 15:01:00
Jackie 2016-01-03 16:25:00
Benji 2016-04-19 13:28:00

※ 입양을 가지 못한 동물이 3마리 이상인 경우만 입력으로 주어집니다.

 

 

문제풀이

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 ASC 
LIMIT 
    3;

 

LEFT JOIN을 사용하여 테이블을 연결 하고 'NULL' 인 경우를 필터링하여 보호소를 나가지 않은 동물을 찾는다.

반환된 값에 들어온 시간을 오래된 순으로 정렬해주고 LIMIT를 걸어 3마리만 SELECT해준다.

문제에서 3마리만 출력하라고 되어 있음으로 잊지말고 LIMIT를 해줘야한다.

이런 쿼리문을 이용하면 들어오고 나가는 데이터의 정보를 파악할 수 있는 것같다.

WHERE절에 NULL필터링을 통해 ANIMAL_INS에만 속하는 동물만 반환하는 것을 보고,

쿼리문으로 합집합 - 교집합 값 찾는 법을 알게된 것 같다. 

728x90
반응형

'프로그래머스 풀이' 카테고리의 다른 글

[javascript]음양 더하기  (1) 2024.03.11
[javascript]짝수와 홀수  (0) 2024.03.08
[javascript]최솟값 만들기  (3) 2024.02.28
[c++] 완전 탐색_카펫  (0) 2024.02.26
[lv.1] 약수의 합(c++)  (0) 2024.02.23