본문 바로가기
SQL 문제 풀기/2. SQLD 기출 : 2024.3.01~2024.4.25

<SQLD 36> 데이터 분석함수에 대한 기출문제

by HYEHYE_SON 2024. 4. 5.
728x90

매일 SQLD 기출 문제 풀기 챌린지


 


문제 35.

주어진 테이블에 대해서 아래와 같이 결과값이 반환되도록 아래의 SQL문의 (  ?  )에 들어갈 윈도우 함수를 적으시오.
 

[ SQLD_36 ]

ENAME SAL
유비 1000
관우 1100
장비 1200
제갈량 1300
조운 1400
황충 1500

 

[ RESULT ]

ENAME SAL SIM_CNT
유비 1000 2
관우 1100 2
장비 1200 2
제갈량 1300 2
조운 1400 2
황충 1500 1

 
 
[ SQL ]

SELECT ENAME, SAL,
COUNT(*) OVER (ORDER BY SAL ( ? ) 
               BETWEEN 50 PRECEDING AND 100 FOLLOWING
               )AS SIM_CNT
FROM SQLD_36;

 
답 : (   ?   )


해설해보기

RANGE는 현재 행의 데이터 값을 기준으로 앞 뒤 데이터 값의 범위를 표시합니다.

■ 기본 문법
COUNT(*) OVER (ORDER BY [컬럼명] RANGE BETWEEN a  PRECEDING AND b FOLLOWING)

count(*)는 행의 개수를 세는 함수인데, over 절을 사용하여 윈도우 함수를 적용할 범위(range)를 정의할 수 있습니다. 
order by[컬럼명] 을 통해서 해당 윈도우 내에서 어떤 행을 어떤 기준으로 정렬할지 지정해줍니다. 
그리고 지정된 컬럼을 기준으로 정렬된 행에 대하여 , 각 행을 중심으로 a 값 만큼 앞의 범위부터 b 값 만큼 뒤의 범위까지 포함하는 행들을 총 개수로 계산합니다. 


 
RANGE BETWEEN 50 PRECEDING AND 100 FOLLOWING는 현재 행을 기준으로

SQLD_37_50 테이블에서 결과 값과 같이 반환되도록  SAL컬럼을 기준으로 정렬을 수행하고,
각 행의 SAL 컬럼 값을 기준으로 -50 ~ + 100 범위 사이에 포함되는 SAL 값을 가지는 모든 행의 수를 COUNT 하여 SIM_CNT 속성 값으로 조회한다. 

 

 즉, 현재 행의 `sal` 값에서 50 빼고, 100을 더한 값 사이에 있는 모든 행들을 포함하여 카운트합니다. 여기서 중요한 점은 `RANGE` 모드에서는 실제 숫자 값의 범위를 기준으로 계산한다는 것입니다. 따라서, `sal` 컬럼의 값이 숫자일 때만 적절하게 작동합니다.

예를 들어, 어떤 행의 `sal` 값이 200이라면, 150(`200-50`)에서 300(`200+100`) 사이에 있는 모든 행들을 포함하여 그 개수를 세게 됩니다. 이를 통해 각 행에 대해 해당 조건을 만족하는 행들의 수를 계산할 수 있습니다.

 


관련 스크립트

create  table  sqld_36
(ename  varchar2(10),
 sal   number(10) );

insert into sqld_36 valueS('유비', 1000);
insert into sqld_36 valueS('관우', 1100);
insert into sqld_36 valueS('장비', 1200);
insert into sqld_36 valueS('제갈량', 1300);
insert into sqld_36 valueS('조운', 1400);
insert into sqld_36 valueS('황충', 1500);
commit;

SELECT ENAME, SAL,
COUNT(*) OVER (ORDER BY SAL  range
               BETWEEN 50 PRECEDING AND 100 FOLLOWING
               )AS SIM_CNT
FROM SQLD_36;

 


 
 
 
 
 
 
 
 

반응형