N% 구하기

도로롱·2025년 8월 12일

⭐목적:

해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.


❤️오답노트 활용 팁

  1. 원인 분석에 집중하세요: 정답 코드를 이해하는 것보다 내가 왜 틀렸는지를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. '실수했다'에서 그치지 않고 '왜 실수했는지'를 파고들어야 같은 실수를 반복하지 않습니다.

  2. 태그를 적극적으로 활용하세요: #JOIN, #서브쿼리, #날짜함수 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.

  3. 주기적으로 다시 풀어보세요: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.

⭐ 오답 노트 TEMPLATE

📆 날짜: 2025-08-12

📌 문제 정보

  • 출처 및 번호: [프로그래머스,대장균의 크기에 따라 분류하기 2]
  • 문제 링크: [https://school.programmers.co.kr/learn/courses/30/lessons/301649]

📝 문제 요약

  • [대장균 개체의 크기를 내름차순으로 정렬시 4등분 하여 각 등급 메김]

❌ 나의 오답 코드

-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
# -- 코드를 작성해주세요
WITH MAIN AS (
SELECT
    ID,
    ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC),
    (SELECT COUNT(ID) FROM ECOLI_DATA ),
    ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC)/(SELECT COUNT(ID) FROM ECOLI_DATA ) AS RATIO
    
FROM
    ECOLI_DATA 
)
SELECT
    ID,
    CASE WHEN
        1-RATIO <=0.24 THEN 'LOW'
        WHEN
         1-RATIO <=0.49 AND  1-RATIO >=0.25  THEN 'MEDIUM'
         WHEN
         1-RATIO <=0.74 AND  1-RATIO >=0.5  THEN 'HIGH'
         WHEN
         1-RATIO >=0.75 THEN 'CRITICAL'
         END COLONY_NAME
FROM
    MAIN
order by
    1

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: '정수 나눗셈인 경우 SQL에서는 소숫점까지 표현 안되고 정수로 나오게 됨
EX) 5/25 = 0.2 (X), 0 .']

근본적인 실수: [예: '당연히 소숫점 계산이 될 줄 알았음.']

헷갈렸던 개념: [예: '순위 함수 삼형제가 늘 헷갈림.']

✅ 정답 코드 및 핵심 로직

WITH COLONY_RANK AS (
    SELECT
        ID,
        -- ROW_NUMBER()를 사용해 순위(RN)를 매깁니다.
        ROW_NUMBER() OVER (ORDER BY SIZE_OF_COLONY DESC) AS RN,
        -- 윈도우 함수로 전체 개수(TOTAL_COUNT)를 효율적으로 구합니다.
        COUNT(*) OVER() AS TOTAL_COUNT
    FROM
        ECOLI_DATA
)

SELECT
    ID,
    CASE
        -- RN에 1.0을 곱해 '정수 나눗셈' 문제를 해결합니다.
        WHEN (RN * 1.0 / TOTAL_COUNT) <= 0.25 THEN 'CRITICAL'
        WHEN (RN * 1.0 / TOTAL_COUNT) <= 0.50 THEN 'HIGH'
        WHEN (RN * 1.0 / TOTAL_COUNT) <= 0.75 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS COLONY_NAME
FROM
    COLONY_RANK
ORDER BY
    ID ASC;


  • 핵심 로직:
    ㄴ 순위/총 ROWS 갯수 = 상위 n% 값 이라는 논리는 맞았음
    ㄴ 서브쿼리 절을 사용 할 경우 각 행 마다 (select count(*) from ...)을 반복 실행 하게되어 속도가 느림
    ㄴ 윈도우 함수는 전체에서 딱 한번 실행 되어 속도가 빠름

📚 핵심 개념 및 배운 점

  • 주요 함수/문법: 윈도우 함수의 목적, 정수를 나눌 경우 소숫점 미반영 문제, 순위 함수

  • 배운 점:

① 윈도우 함수 개념 복습

  • 사용 목적: 원래 테이블의 열은 그대로 유지 하면서, 다른 열만 추가하고 싶을때
    EX) 각 행의 순위 계산, 각 행의 누적합 계산, 각 행의 다음 행 계산 등
-- 누적 합 계산
SELECT
	ORDER_DATE,
    SUM(DAILY_SALES) OVER (ORDER BY ORDER_DATE) AS RUNNING_TOTAL
FROM
	sales
SELECT
	ID,
    SALES,
    RANK() OVER (ORDER BY SALES DESC) AS SALES_RANK -- 판매 내림차순 순위
FROM
	sales
SELECT
	sale_month,
    sale_AMOUNT,
    LAG(SALES_AMOUNT,1,0) OVER (ORDER BY SALES_MONTH) ---- 이전 달의 매출 가져오기
FROM
	monthly_sales

② 정수를 정수로 나눌 경우

  • SQL 에서 정수/정수 일 경우 정수로 나오기 때문에 1/5 =0.2(X), 1/5 =0
    분자의 정수 타입 같은 경우 1.0이라는 어거지 소숫점 패턴이 필요하다.
    EX) 1 * 1.0 / 5 = 0.2
profile
질문 없는 성장은 없다. 3년차 데이터 분석가

0개의 댓글