SQL 고득점 Kit - 9.4

김동현·2024년 9월 4일

SQL 고득점 Kit

목록 보기
47/56

IS NULL - 업그레이드 할 수 없는 아이템 구하기

문제

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/273712

풀이

-- 아이템의 부모가 있다면 그 부모는 업그레이드를 할 수 있음
WITH no_upgrade AS(
    SELECT i1.ITEM_ID
    FROM ITEM_TREE i1
    LEFT JOIN ITEM_TREE i2 
    ON i1.ITEM_ID = i2.PARENT_ITEM_ID -- 아이템의 부모를 매칭하여 부모 ID가 없는 아이템 식별
    WHERE i2.PARENT_ITEM_ID IS NULL -- 부모 아이디가 NULL이라면 업그레이드 불가.
)

SELECT i.ITEM_ID, i.ITEM_NAME, i.RARITY
FROM no_upgrade n
INNER JOIN ITEM_INFO i
ON n.ITEM_ID = i.ITEM_ID
ORDER BY i.ITEM_ID DESC

리뷰

  • 어제 참고했던 다른 사람의 셀프 조인을 떠올려서 적용했다.
  • 아이템의 부모 아이템 아이디가 존재한다면 부모 아이템은 자식 아이템으로 업그레이드가 가능하다. 그것으로 업그레이드 불가 아이템 ID를 식별할 수 있다.

String, Date - 분기별 분화된 대장균의 개체 수 구하기

문제

각 분기(QUARTER)별 분화된 대장균의 개체의 총 수(ECOLI_COUNT)를 출력하는 SQL 문을 작성해주세요. 이때 각 분기에는 'Q' 를 붙이고 분기에 대해 오름차순으로 정렬해주세요. 대장균 개체가 분화되지 않은 분기는 없습니다.

https://school.programmers.co.kr/learn/courses/30/lessons/299308

1차 풀이

-- 분기 설정
WITH qua AS(
    SELECT  
        CASE 
            WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 1 AND 3 THEN '1Q'
            WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 3 AND 6 THEN '2Q'
            WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 6 AND 9 THEN '3Q'
            ELSE '4Q'
        END 'QUARTER'
    FROM ECOLI_DATA
)

SELECT *, COUNT(QUARTER) ECOLI_COUNT
FROM qua
GROUP BY QUARTER
ORDER BY QUARTER

2차 풀이

SELECT 
    CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') QUARTER,
    COUNT(*) ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER

리뷰

  • 1차 풀이는 내가 혼자서 해결했다. CASE를 통해 분기를 설정해주고 그룹화 후 출력을 했는데 2차 풀이를 통해 새로운 함수와 방식을 알 수 있게 되었다. (내가 끙끙 앓는 것도 좋지만 이렇게 좋은 코드를 보고 이해하는 것도 좋은듯)
  • QUARTER라는 함수가 날짜를 분기로 알아서 맞춰준다. (신기...) 그래서 CONCAT으로 Q만 붙여주고 그룹화 후 카운트를 해주면 1차보다 훨씬 짧고 보기 쉽게 쿼리를 짤 수 있다.

GitHub

업그레이드 할 수 없는 아이템 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/3/273712.%E2%80%85%EC%97%85%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C%E2%80%85%ED%95%A0%E2%80%85%EC%88%98%E2%80%85%EC%97%86%EB%8A%94%E2%80%85%EC%95%84%EC%9D%B4%ED%85%9C%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

분기별 분화된 대장균의 개체 수 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/299308.%E2%80%85%EB%B6%84%EA%B8%B0%EB%B3%84%E2%80%85%EB%B6%84%ED%99%94%EB%90%9C%E2%80%85%EB%8C%80%EC%9E%A5%EA%B7%A0%EC%9D%98%E2%80%85%EA%B0%9C%EC%B2%B4%E2%80%85%EC%88%98%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글