일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- @SubscribeMapping
- 기본키 전략
- 쉘 스크립트
- Git
- JDBC
- JPA
- 컴파일 타임 상수
- 쿠키
- 메모리 구조
- mysql
- 백준
- 런타임 상수
- 알고리즘
- 리눅스
- 프로그래머스
- DTO
- 오블완
- API
- compgen
- application layer
- 파이썬
- BindingResult
- m:n
- 티스토리챌린지
- @Autowired
- allocationSize
- 커밋 되돌리기
- intelij spring config
- 편향된 지수
- spring
- Today
- Total
둘셋 개발!
[SQL] 프로그래머스 - 대장균의 크기에 따라 분류하기 2 (feat. 순위 관련 윈도우 함수) 본문
intro.
SQL문제를 풀다가 백분율에 관련된 문제를 만났다.
고민을 하다 해결하지 못해, 검색을 해봤더니 순위 관련 윈도우 함수를 사용하면 해결할 수 있다는 것을 알았다.
평소 자주쓰지 않아서 잊고 살았던, 새롭게 알게된 순위 관련 윈도우 함수를 정리해보고
문제에 대한 접근도 정리해보려 한다.
윈도우 함수란?
행과 행 간의 관계를 쉽게 정의, 비교, 계산하기 위해 만든 함수이다.
쉽게 말해 SUM(), MAX()는 컬럼 단위의 계산이고, 행 단위의 비교 및 계산을 할 수 있는 것이 윈도우 함수라고 생각하면 된다.
윈도우 함수에는 순위, 백분위, 집계, 특정 행 앞 뒤로 참조 가능한 함수 등이 있다.
순위 기반 윈도우 함수
데이터의 순위를 매기는 함수이다.
함수 | 설명 |
RANK() | 중복값 존재 시 같은 순위, 다음 순위 건너뜀 |
DENSE_RANK() | 중복값 존재 시 같은 순위, 다음 순위 건너뛰지 않음 |
ROW_NUMBER() | 중복값 없이 행마다 고유한 순위 부여 |
PERCENT_RANK() | 백분율 순위 |
CUME_DIST() | 누적 분포 백분율 |
표에서 아래 두 개의 함수에 대해 비교를 해보자면,
PERCENT_RANK()는 순위에 대한 백분율이고 , CUME_DIST()는 현재 값 이하의 값들을 누적하여 백분율을 계산한다.
예를 들어 학생 ID와 학생에 대한 점수가 있는 테이블이 있다고 해보자.
각각의 학생이 상대적으로 상위 몇 퍼센트인지 궁금할 때는 PERCENT_RANK()를 사용하고
특정 점수 이하의 학생들이 전체 몇 퍼센트를 차지하고 있는지 궁금할 때는 CUME_DIST()를 사용하는 것 같다.
이제 문제를 살펴 보자.
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/301649
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 해결
문제의 핵심은 상위 0%~ 25%, 상위 26%~50%, ... 이렇게 상위 퍼센트의 구간별로 구분값을 적용하는 것이다.
이 경우 행과 행간의 계산을 해야하기 때문에 윈도우 함수를 사용해야하고
그 중 백분율과 관련된 함수를 사용해야 한다.
각각의 대장균의 상대적 순위에 대한 퍼센트를 구한 후 문제에 정의해놓은 구간에 맞게 구분값을 설정해야 함으로
PERCENT_RANK()를 활용하는 것이 좋겠다.
select
e.ID as ID,
(case when e.percent <= 0.25 then 'CRITICAL'
when e.percent <= 0.5 then 'HIGH'
when e.percent <= 0.75 then 'MEDIUM'
else 'LOW'
end) as COLONY_NAME
from
(select
ID,
percent_rank() over (order by SIZE_OF_COLONY desc) as percent
from
ECOLI_DATA) e
order by
e.ID asc;
ref.
https://schatz37.tistory.com/12 (윈도우 함수 개념을 잘 설명해주는 글이 있음)
'데이터베이스' 카테고리의 다른 글
[SQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기 (0) | 2025.03.16 |
---|---|
[SQL] 프로그래머스 - 특정 세대의 대장균 찾기 (0) | 2025.03.15 |
[MySQL] mysql 스레딩 (0) | 2024.11.12 |
[MySQL] 사용자 식별(1) - 계정 (0) | 2024.11.10 |
[MySQL] 시스템 변수 변경 (1) | 2024.11.09 |