류나의 갓생살기

20대의 마지막을 갓생으로 장식하기

Data Science/SQL

프로그래머스 SQL 고득점 Kit

Ryuna (류준범) 2020. 7. 19. 19:22

프로그래머스의 SQL 고득점 Kit을 풀어봤습니다. 대부분 풀만했고, 몇 개 정도가 고민되는 문제였으며, 1문제는 정말 생각이 안 나서 답을 참고했습니다.

 

우선 가장 어렵다고 생각되는 문제는 입양 시각 구하기 2

0시부터 23시까지 시간대별로 입양 횟수를 보여주면 되는 문제인데, 시간대를 구하는 것 자체는 HOUR 함수를 이용하면 돼서 쉽습니다. 어려운 점은 특정 시간대(0시~6시, 20시~23시)의 입양 횟수가 0이라서 일반적인 방법으로는 그 시간대가 아예 결과에 보이지 않는다는 것이죠.

그래서 변수를 도입해야 합니다.

SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) HOUR, (
    SELECT COUNT(*)
    FROM ANIMAL_OUTS
    WHERE HOUR(DATETIME) = @HOUR
    ) COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23 

이렇게 @HOUR라는 변수를 만들고 0부터 23까지 키우면서 시간대가 @HOUR와 같은 행의 개수를 COUNT로 세면 됩니다.

저도 몰랐던 내용인데 배워갑니다.

 

그 외에 꽤 고민했던 문제는 오랜 기간 보호한 동물 1

SELECT NAME, DATETIME
FROM (
    SELECT *
    FROM ANIMAL_INS
    WHERE ANIMAL_ID IN (
        SELECT ANIMAL_ID
        FROM ANIMAL_INS
        MINUS
        SELECT ANIMAL_ID
        FROM ANIMAL_OUTS
        )
    ORDER BY DATETIME
    )
WHERE ROWNUM <= 3 

차집합을 적용한 다음 시간대에 따라 정렬하고, 그 중 상위 3개만 보여주는 문제라서 위와 같이 SELECT를 중첩해서 썼습니다.

 

 보호소에서 중성화한 동물 같은 경우에는

SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
    AND (
        A.SEX_UPON_INTAKE = 'Intact Male'
        OR A.SEX_UPON_INTAKE = 'Intact Female'
        )
    AND (
        B.SEX_UPON_OUTCOME = 'Neutered Male'
        OR B.SEX_UPON_OUTCOME = 'Spayed Female'
        ) 

이런 식으로 inner join을 해 준 다음 WHERE 절에 AND를 덧붙여 원하는 조건을 넣어주었습니다.

 

오랜 기간 보호한 동물 2같은 경우에도 마찬가지로,

SELECT *
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 

이렇게 조인을 먼저 해주고, 정렬 기준을 적용한 뒤 상위 2개를 보여주도록 하면 되겠습니다.

 

마지막으로, SQL 고득점 Kit에는 포함되어 있지 않지만 프로그래머스에 있는 우유와 요거트가 담긴 장바구니 문제도 풀어보았습니다.

SELECT A.CART_ID
FROM (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = '우유'
) A, (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = '요거트'
) B
WHERE A.CART_ID = B.CART_ID
ORDER BY CART_ID 

우유가 담긴 장바구니와 요거트가 담긴 장바구니를 따로따로 가져온 뒤 둘을 조인하면 쉽겠다고 생각해서, 위와 같이 풀었습니다.

 

역시 문제를 풀어보니 한결 쉽게 다가오는 느낌이 드네요!

'Data Science > SQL' 카테고리의 다른 글

[HackerRank] SQL - Weather Observation Station 3  (0) 2020.08.03
모두의 SQL: 후기  (0) 2020.07.19