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;
반응형
'SQL 문제 풀기 > 2. SQLD 기출 : 2024.3.01~2024.4.25' 카테고리의 다른 글
<SQLD 38> 조인에 대한 기출문제 (0) | 2024.04.07 |
---|---|
<SQLD 37> 기타 비교연산자 대한 기출문제 (0) | 2024.04.06 |
<SQLD 35> 그룹 함수에 대한 기출문제 (0) | 2024.04.04 |
<SQLD 34> 그룹 함수와 null 값에 대한 기출문제 (0) | 2024.04.03 |
<SQLD 33> 그룹 함수에 대한 기출문제 (0) | 2024.04.02 |