매일 SQLD 기출 문제 풀기 챌린지
문제 45.
파티션 별 윈도우에서 가장 먼저 나온 값을 구하는 WINDOW FUNCTION은 무엇인가?
① FIRST_VALUE
② LAG
③ LAST_VALUE
④ LEAD
해설해보기
[ 설명을 위한 테이블 : EMP_DATA ]
EMPLOYEE_ID | DEPARTMENT_ID | NAME | SALARY |
1 | 101 | Kim | 3000 |
2 | 101 | Lee | 4000 |
3 | 102 | Park | 3500 |
4 | 102 | Choi | 2000 |
■ FIRST_VALUE 함수
이 함수는 지정된 윈도우(파티션) 내에서 첫 번째 값을 반환하는 함수입니다.
특정 기준에 따라 데이터를 그룹화하여 각 그룹 내에서 첫 번째 값을 선택할 때 사용합니다.
쉽게 말해 그룹 내에서 첫 번째 값을 가져오는 함수입니다.
EMP_DATA 테이블에 적용해보면 아래와 같이
각 부서별로 가장 높은 급여를 받는 직원의 이름을 반환하는 것을 확인할 수 있습니다.
SELECT department_id,
FIRST_VALUE(name) OVER(PARTITION BY department_id ORDER BY salary DESC) AS highest_earner
FROM emp_data;
■ LAG 함수
현재 행으로부터 지정된 수만큼 이전 행의 데이터를 가져오는 윈도우 함수입니다.
LAG는 특정 행에 대해 이전 행의 데이터를 참조할 때 사용됩니다.
EMP_DATA 테이블에 적용해보면 아래와 같이
각 직원의 이전 직원의 급여를 출력하는 것을 확인할 수 있습니다.
이때, 이전행이 없을 경우 NULL을 반환합니다.
SELECT employee_id,
name,
salary,
LAG(salary, 1) OVER(ORDER BY salary) AS previous_salary
FROM emp_data;
■ LAST_VALUE 함수
윈도우(파티션) 내에서 마지막 값을 반환하는 함수입니다.
이 함수는 각 그룹별로 마지막에 위치한 값을 선택할 때 사용됩니다.
쉽게 말해 그룹 내에서 마지막 값을 가져오는 함수입니다.
주의할 점은, LAST_VALUE 함수를 사용할 때 OVER () 절 내에서 윈도우의 범위를 지정해주어야 한다는 것입니다.
LAST_VALUE 함수는 기본 설정만으로는 현재 행까지만 윈도우의 범위로 삼기 때문에
예상과는 다른 결과를 반환할 수 있습니다.
특히 마지막 값을 얻고자 할 때 파티션의 끝까지 고려하지 않을 경우, 실제 마지막 값이 아닌
현재 행에 대한 마지막 값이 반환될 수 있습니다.
만약 파티션 내의 모든 행을 대상으로 마지막 값을 얻기 위해서는
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLWING 구문을 사용해야 합니다.
- UNBOUNDED PRECENDING
: 현재 파티션의 시작부터 시작(파티션의 첫 번째 행부터 현재 행 까지를 의미)
- UNBOUNDED FOLLOWING
: 현재 파티션의 끝까지 (현재 행부터 파티션의 마지막 행가지를 의미)
EMP_DATA 테이블에 적용해보면 아래와 같이
각 부서별로 가장 낮은 급여를 받는 직원의 이름을 반환하는 것을 확인할 수 있습니다.
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLWING 구문을 사용하여 파티션 내 모든 행에서의 마지막 값을 정확하게 얻을 수 있도록 하였습니다.
SELECT department_id,
LAST_VALUE(name) OVER(PARTITION BY department_id ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lowest_earner
FROM emp_data;
■ LEAD 함수
현재 행으로부터 지정된 수만큼 다음 행의 데이터를 가져오는 윈도우 함수입니다. 특정 행에 대해 다음 행의 데이터를 찹조할 때 사용됩니다.
EMP_DATA 테이블에 적용해보면 아래와 같이
각 직원의 다음 직원의 급여를 보여줍니다.
이때, 마지막 행은 다음 행이 없으므로 NULL을 반환합니다.
SELECT employee_id,
name,
salary,
LEAD(salary, 1) OVER(ORDER BY salary) AS next_salary
FROM employee_data;
따라서 정답은
① FIRST_VALUE 입니다.
관련 스크립트
# 설명을 위한 데이터
CREATE TABLE emp_data (
employee_id NUMBER,
department_id NUMBER,
name VARCHAR2(50),
salary NUMBER
);
INSERT ALL
INTO emp_data (employee_id, department_id, name, salary) VALUES (1, 101, 'Kim', 3000)
INTO emp_data (employee_id, department_id, name, salary) VALUES (2, 101, 'Lee', 4000)
INTO emp_data (employee_id, department_id, name, salary) VALUES (3, 102, 'Park', 3500)
INTO emp_data (employee_id, department_id, name, salary) VALUES (4, 102, 'Choi', 2000)
SELECT * FROM dual;
'SQL 문제 풀기 > 2. SQLD 기출 : 2024.3.01~2024.4.25' 카테고리의 다른 글
<SQLD 47> natural join에 대한 기출문제 (0) | 2024.04.16 |
---|---|
<SQLD 46> Order by에 대한 기출문제 (0) | 2024.04.15 |
<SQLD 44> 조인에 대한 기출문제 (0) | 2024.04.13 |
<SQLD 43> in 연산자 대한 기출문제 (0) | 2024.04.12 |
<SQLD 42> like 연산자에 대한 기출문제 (0) | 2024.04.11 |