SQL 고득점 Kit - 9.6

김동현·2024년 9월 5일

SQL 고득점 Kit

목록 보기
49/56

SELECT - 대장균의 크기에 따라 분류하기 2

문제

대장균 개체의 크기를 내름차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 . 단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

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

풀이

-- 크기를 내름차순으로 정렬 후 순위로 분류
WITH size_rank AS(
    SELECT 
        ID,
        NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) '등급'
    FROM ECOLI_DATA
    ORDER BY ID
)

SELECT
    ID,
    CASE 
        WHEN 등급 = 1 THEN 'CRITICAL'
        WHEN 등급 = 2 THEN 'HIGH'
        WHEN 등급 = 3 THEN 'MEDIUM'
        ELSE 'LOW'
    END 'COLONY_NAME'
FROM size_rank

리뷰

  • 상위 분류를 해결하지 못하고 비율을 나눠주는 함수가 있을 것이라 생각하고 NTILE라는 새로운 함수를 찾아서 문제를 해결했다. (rank를 이용해서 정렬한 뒤 순위권에 대해서 몫을 나눠서 풀 수 있지 않을까? 사실 모름)
  • 다른 사람들의 풀이를 보면 해당 함수를 몰라도 어떻게 rank를 이용하여 풀었는데 나는 그렇게 풀지도 못 하였다. 그래도 내가 무엇을 못 풀고 새로운 것을 알 수 있게 된 계기가 되었다.

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

대장균의 크기에 따라 분류하기 2
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/301649.%E2%80%85%EB%8C%80%EC%9E%A5%EA%B7%A0%EC%9D%98%E2%80%85%ED%81%AC%EA%B8%B0%EC%97%90%E2%80%85%EB%94%B0%EB%9D%BC%E2%80%85%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0%E2%80%852

분기별 분화된 대장균의 개체 수 구하기
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개의 댓글