프로그래머스의 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 |