문제 112. 다음중 윈도우 함수(Window Function, Analytic Function)에 대한 설명으로 가장 부적절한 것은?
- Partition과 Group By 구문은 의미적으로 유사하다
- Partition 구문이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일하다
- 윈도우 함수 처리로 인해 결과 건수가 줄어든다
- 윈도우 함수 적용 범위는 Partition을 넘을 수 없다
① Partition과 Group By는 의미적으로 유사하다 ✅
GROUP BY : 그룹을 나눠서 집계
PARTITION BY : 그룹처럼 나눠서 윈도우 계산
둘 다 그룹처럼 나눈다는 점에서 의미가 비슷함
RANK() OVER (ORDER BY 매출 DESC)
② Partition이 없으면 전체를 하나의 Partition으로 본다 ✅
PARTITION이 없으니까 전체 테이블을 하나로 보고 순위 매김
SELECT 고객번호, 매출,
RANK() OVER(ORDER BY 매출 DESC)
③ 윈도우 함수 처리로 인해 결과 건수가 줄어든다 ❌
윈도우 함수는 행 수를 줄이지 않는다, 원래 행수 그대로 유지하면서, 그 위에 계산 결과 컬럼을 추가한다
행 개수는 그대로! 행을 줄이는 건 GROUP BY
④ 윈도우 함수 적용 범위는 Partition을 넘을 수 없다 ✅
문제 113. 다음 중 아래와 같은 테이블에서 SQL을 실행할 때 결과로 가장 적절한 것은?

🔹 먼제 안쪽 SELECT 서브쿼리가 뭐하는지 보자
▪ 고객(A)와 월별매출(B)을 고객번호로 INNER JOIN
▪ 고객번호별로 SUM(매출액)해서 고객별 총매출을 만든다
▪ 고객명은 고객번호당 하나니까 MAX(고객명)으로 그냥 같이 뽑아둠(대표값)
즉 결과는 고객별 총매출 테이블이 됨
🔹 그리고 고객별 총매출을 직접 계산
표에서 월별매출을 고객번호별로 더하면 됨
RANK() OVER(ORDER BY 매출액 DESC)
🔹 바깥 SELECT가 순위를 매김
매출액 큰 순으로 순위
RANK는 동점이면 같은 순위주고, 다름 순위는 건너뜀!!!!
정답 1번
문제 114. 아래 데이터 모델에서 활동점수가 높은 고객을 게임상품ID별로 10등까지 선별하여 사은행사를 진행하려고 한다. 다음 SQL 중 가장 적절한 것은?
(단, 활동점수가 동일한 고객은 동일등수로 한다. 아래 결과 예제 참조)


문제를 읽어보면
🔹 게임상품ID 별로 : 상품마다 따로 순위를 매긴다는 뜻
🔹 활동점수가 높은 고객을 10등까지 : 순위 매긴 다음 10등까지만 필터
🔹 동점은 동일등수 : RANK, DENSE_RANK 중 하나 여기서 결정은 예시 표가 해줌
예시 표로 RANK vs DENSE_RANK를 즉시 판별
예시 등수가 이렇게 건너뛰는 형태
150점이 2명, 둘 다 1등
그 다음 110점이 3등
...
등수가 건너뛰면 : RANK()
안건너뛰면 : DENSE_RANK()
PARTITION BY
PARTITION BY 게임상품ID는
게임상품ID별로 그룹을 나눠서, 그 안에서만 계산하라는 뜻
| 게임상품ID | 고객ID | 활동점수 |
| 001 | A | 100 |
| 001 | B | 90 |
| 002 | C | 200 |
| 002 | D | 150 |
고객활동 테이블이 이렇게 있다고 해보자
RANK() OVER (ORDER BY 활동점수 DESC)
PARTITION 없이 쓰면
전체 테이터를 하나로 보고 순위를 매김
| 상품 | 고객 | 점수 | 순위 |
| 002 | C | 200 | 1 |
| 002 | D | 150 | 2 |
| 001 | A | 100 | 3 |
| 001 | B | 90 | 4 |
상품 섞여서 순위 매겨짐
RANK() OVER (PARTITION BY 게임상품ID ORDER BY 활동점수 DESC)
PARTITION BY 게임상품ID 쓰면
상품별로 나눠서 각각 따로 순위 매김
| 상품 | 고객 | 점수 | 순위 |
| 001 | A | 100 | 1 |
| 001 | B | 90 | 2 |
| 002 | C | 200 | 1 |
| 002 | D | 150 | 2 |
👉 상품 001 안에서만 순위
👉 상품 002 안에서만 순위
문제 115. 다음 중 추천내역 테이블에서 아래와 같은 SQL을 수행하였을 때의 결과로 가장 적절한 것은?

🍑 ROW_NUMBER()
순번 매기는 함수
예를 들어 95 | 90 | 80이 있다고 하면
95 : 1등
90 : 2둥
80 : 3등
이렇게 된다
🍑 OVER(...)
윈도우 함수 범위 지정
어디 기준으로 순번 매길지 정하는 부분
| 추천경로 | 추천점수 |
| 네이버 | 90 |
| 네이버 | 80 |
| 인스타 | 95 |
| 인스타 | 85 |
🍑 PARTITION BY 추천경로
추천경로별로 그룹 나눔
ROW_NUMBER() OVER(PARTITION BY 추천경로 ORDER BY 추천점수 DESC) AS RNUM
▪️추천경로별로 묶고(PARTITION BY 추천경로)
▪️그 안에서 추천점수 내림차순(큰 점수 먼저)
▪️1등부터 번호(ROW_NUMBER) 매김
▪️바깥에서 WHERE RNUM = 1 ➡️ 각 추천경로에서 1등만 남김
즉, 추천경로별 TOP 1 뽑기
ROW_NUMBER()
🔴 OVER이 없으면 에러남!
ROW_NUMBER()만 사용하면 에러가 발생하는데 : 범위를 모르기 때문입니다
ROW_NUMBER() OVER()
| 점수 | 순번 |
| 90 | 1 |
| 80 | 2 |
| 70 | 3 |
🔴 OVER이 있으면
전체 데이터에서 1, 2, 3 순번이 정해진다
위의 표처럼 말이다!
윈도우 함수가 어떤 범위에서 계산될지를 정하는 것
쉽게 이 함수, 어디 기준으로 계산할래?를 정하는 옵션
ROW_NUMBER() OVER(PARTITION BY 추천경로)
🔴 PARTITION 넣으면
추천경로별로 따로 계산
| 추천경로 | 점수 | 순번 |
| SNS | 90 | 1 |
| SNS | 80 | 2 |
| 홈페이지 | 95 | 1 |
| 홈페이지 | 85 | 2 |
정답 3번
문제 116. 다음 중 아래의 SQL에 대한 설명으로 가장 적절한 것은?

🍑 PRECEDING
현재 행보다 이전(위쪽) 행들을 포함하라는 뜻
즉 과거 데이터 범위 지정
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
어디서 사용하는가 : OVER() 안에서 ROWS BETWEEN이랑 같이 씀
[문제 풀이]
① WINDOW FUNCTION을 GROUP BY 절과 함께 사용하였으므로 위의 SQL은 오류가 발생한다 ❌
➡️ GROUP BY 결과에 대해 윈도우 함수 적용하는 패턴 흔함
② WINDWO FUNCTION의 ORDER BY절에 AVG 집계 함수를 사용하였으므로 위의 SQL은 오류가 발생한다 ❌
➡️ GROUP BY로 이미 분류코드별로 1행이 되었기 때문에 그 행의 정렬기준으로 AVG(상품가격) 같은 집계 결과를 쓰는게 가능
③ “분류코드별 평균가격을 비교해서 ±10000 사이에 있는 분류코드 개수” ✅
④ 상품 전체 평균상품가격 기준으로 ±10000 상품 개수” ❌
이 SQL은 상품(개별 행)을 세는게 아니라 GROUP BY 후 분류코드(집계 결과 행)를 세는 구조
문제 117. 다음 중 [사원] 테이블에 대하여 아래와 같은 SQL을 수행하였을 때 예쌍되는 결과로 가잘 적절한 것은?

이 SQL은 한마디로 "부서별 최고 연봉인 사원만 뽑아라"를 하고 있다
SQL을 나누어 살펴보도록 하자
SELECT 사원ID,
MAX(연봉) OVER(PARTITION BY 부서ID) AS 최고연봉
FROM 사원
💠서브쿼리 X가 하는 일
PARTITION BY 부서ID ➡️ 부서별로 묶고
MAX(연봉) OVER(...) → 각 부서의 최고연봉을 모든 행에 붙여줌
WHERE X.사원ID = Y.사원ID
AND X.최고연봉 = Y.연봉
💠바깥 WHERE 조건이 핵심
X.사원ID = Y.사원ID : 같은 사람끼리 붙이고
X.최고연봉 = Y.연봉 : 그 사람의 연봉이 부서 최고연봉과 같으면 통과
결국 "부서 최고연봉자만 남는다"
정답 1번
'🍏 개발일기 > 으쌰으쌰 SQLD 자격증 준비' 카테고리의 다른 글
| 노랭이 123P 부터 시작 118번 ~ 123번 (0) | 2026.02.14 |
|---|---|
| 노랭이 104P 부터 시작 101번 ~ 110번 (0) | 2026.02.14 |
| JOIN (0) | 2026.02.13 |
| 데이터 모델과 SQL & GROUP BY절, HAVING절, ORDER BY 절 (0) | 2026.02.12 |
| 노랭이 88P 부터 시작 78번 ~ 89번 (0) | 2026.02.11 |