🍏 개발일기/으쌰으쌰 SQLD 자격증 준비

노랭이 166P 부터 시작 112번 ~ 117번

보배 진 2026. 2. 13. 22:18

문제 112. 다음중 윈도우 함수(Window Function, Analytic Function)에 대한 설명으로 가장 부적절한 것은?

  1. Partition과 Group By 구문은 의미적으로 유사하다
  2. Partition 구문이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일하다
  3. 윈도우 함수 처리로 인해 결과 건수가 줄어든다
  4. 윈도우 함수 적용 범위는 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번