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

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

by HYEHYE_SON 2024. 4. 14.
728x90

매일 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;

 
 

반응형