취준일지/SQLD

프로그래머스 - SQL 고득점 Kit

양쏘쏘 2021. 10. 28. 23:00
728x90
반응형

백신 맞고 심심해서 풀다보니 고득점 키트를 다 풀어버렸다.

문제는 다 Oracle로 풀었다는 점..?

정답이긴 해도 효율 생각안하고 직관적으로 풀어버려서 맘에 안들긴하는데 

지금 노트북에는 오라클을 안깔아둬서 어쩔 수 없다.

저 중에서 어느정도 난이도 있는 문제와 개인적인 코드 리뷰를 적어볼까한다.

 

1. GROUP BY - 입양 시간 구하기(1)

데이터가 많은 경우 TO_CHAR, TO_DATE같은 함수로 데이터 내용 일부를 추출하거나 변환할 때 시간이 많이 걸려서

그 횟수를 줄이고자 아래와 같이 짰고 BETWEEN AND 를 안 쓴 이유는 포함여부가 헷갈리는 것을 막기 위함이다. 

--입양 시각 구하기(1)
SELECT HOUR,COUNT(HOUR) AS COUNT 
FROM (
    SELECT 
    TO_CHAR(DATETIME,'HH24') AS HOUR
    FROM ANIMAL_OUTS
)
WHERE HOUR >= 9 AND HOUR <20
GROUP BY HOUR
ORDER BY HOUR ASC

 

2. GROUP BY - 입양 시간 구하기(2)

이게 만약 손코딩이였다면 엄청 헷갈렸을 것 같다. 

조인 개념으로 풀긴했는데 사실 가독성이 떨어지고 함수도 많이 써서 그닥 맘에 드는 코드는 아니지만

다 풀고 질문을 봐도 그렇게 괜찮아보이는 코드가 없긴했다.

SELECT A.HOUR,NVL(B.COUNT,0) AS COUNT
FROM 
(SELECT LEVEL-1 AS HOUR
FROM DUAL
CONNECT BY LEVEL<= 24) A,
(SELECT TO_CHAR(DATETIME,'HH24') AS HOUR,
 COUNT(TO_CHAR(DATETIME,'HH24')) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')) B
WHERE A.HOUR = B.HOUR(+)
ORDER BY A.HOUR


---1단계
SELECT HOUR,COUNT(HOUR) AS COUNT
FROM
(
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR
FROM ANIMAL_OUTS 
)
GROUP BY HOUR
ORDER BY HOUR

 

3. IS NULL - NULL 처리하기

NVL을 쓰면 편하다를 보여주려고 case로도 코드를 짜봤다. 

--case then
SELECT ANIMAL_TYPE,
CASE WHEN NAME IS NULL
THEN 'No name'
ELSE NAME
END AS NAME,SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

--NVL 
SELECT ANIMAL_TYPE,
NVL(NAME,'No name') AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

4. JOIN - 오랜 기간 보호한 동물(1)

더 잘 짤 수도 있을 거같은데 별 생각이 나질 않아서 누가 훈수 좀 뒀으면 좋겠다. 

NOT IN으로 짠 사람도 있던 데 그렇게 하면 IN 안에 내용을 하나씩 다 비교해야하기 때문에 비추다.

SELECT *
FROM
(SELECT AI.NAME,AI.DATETIME
 FROM ANIMAL_INS AI,ANIMAL_OUTS AO
 WHERE AI.ANIMAL_ID = AO.ANIMAL_ID(+)
 AND AO.ANIMAL_ID IS NULL
 ORDER BY AI.DATETIME ASC
) 
WHERE ROWNUM <= 3

 

5. JOIN - 보호소에서 중성화한 동물

들어올 때랑 나갈 때의 중성화 여부가 다름으로 조건 걸어서 푸는 거 보고 발상이 대단하다고 생각했다.

이런 경우 NULL값이 들어갈 수 있는 지를 확인하는 것이 제일 중요할 것 같다. 

SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AI, ANIMAL_OUTS AO
WHERE AI.ANIMAL_ID = AO.ANIMAL_ID
AND AI.SEX_UPON_INTAKE LIKE 'Intact%'
AND (AO.SEX_UPON_OUTCOME LIKE 'Spayed%'
OR AO.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY AI.ANIMAL_ID ASC

--간단하게
SELECT AI.ANIMAL_ID, AI.ANIMAL_TYPE, AI.NAME
FROM ANIMAL_INS AI, ANIMAL_OUTS AO
WHERE AI.ANIMAL_ID = AO.ANIMAL_ID
AND AI.SEX_UPON_INTAKE != AO.SEX_UPON_OUTCOME
ORDER BY AI.ANIMAL_ID ASC

 

6. String,Date - 중성화 여부 파악하기

case then 쓰고 like로 조건 거는 건 자주 쓰이는 거라 봐두면 좋겠다 싶어서 남겨본다.

SELECT ANIMAL_ID,NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' 
          OR SEX_UPON_INTAKE LIKE 'Spayed%' 
     THEN 'O'
     ELSE 'X'
END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
728x90