윈도우 함수 개념? 4가지 종류의 함수 소개

윈도우 함수 개념에 대한 설명
윈도우 함수 개념에 대한 설명

윈도우 함수 개념에 대해서 이야기해봅시다.




윈도우 함수 개념에 대해 알기

윈도우 함수(Window Function)SQL(Structured Query Langauge)에서 행과 행 간을 비교하고 연산, 정의하기 위해서 사용하는 함수입니다. 윈도우 함수를 분석 함수나 순위 함수라고도 부릅니다.

윈도우 함수는 다른 함수들과 다르게 중첩 해서 사용할 수 없지만 서브 쿼리에서 사용할 수 있습니다.

윈도우 함수(Window Function)는 OVER 키워드와 함께 사용합니다.

윈도우 함수의 종류에는 순위 함수, 집계 함수, 행 순서 함수, 비율 함수가 있습니다.


[윈도우 함수 기본 문법]

SELECT
WINDOW_FUNCTION (ARGUMENTS) OVER([PARTITION BY 컬럼1] [ORDER BY 컬럼1] [WINDOWING 절])
FROM 테이블1
GROUP BY 컬럼1 ;




윈도우 함수 개념에 대한 설명

윈도우 함수(Window Function)데이터 베이스(DB, DataBase)의 테이블 데이터에서 행과 행 간의 관계를 보다 쉽게 정의하기 위해서 만든 함수입니다.

윈도우 함수는 SQL(Structured Query Language)에서 데이터의 행과 행 간을 비교하거나 연산하거나 정의하기 위해서 사용합니다. 윈도우 함수에서는 OVER 문구가 필수적으로 들어 갑니다.

윈도우 함수의 대표적인 함수로는 순위 함수, 집계 함수, 행 순서 함수, 비율 함수가 있습니다.

[윈도우 함수의 종류]

구분내용
순위 함수RANK, DENSE_RANK, ROW_NUMBER
집계 함수SUM, MAX, MIN, AVG, COUNT
행 순서 함수FIRST_VALUE, LAST_VALUE, LAG, LEAD
비율 함수CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT




1. 순위 함수

순위 함수에는 RANK, DENSE_RANK, ROW_NUMBER가 있습니다.

RANK 함수의 경우 1, 2, 2, 4, 5, 5, 7,.. 과 같은 형태가 되며 DENSE_RANK 함수는 1, 2, 2, 3, 4, 4, 5, … 와 같은 형태로 출력 되며 ROW_NUMBER 함수는 1, 2, 3, 4, 5, 6, 7, … 형태로 조회 됩니다.

RANK는 동일한 순위가 존재할 대 존재하는 수만큼 건너 뛰어서 다음 순위를 매기는데 DENSE_RANK 함수는 동일한 순위를 하나의 건수로 취급하여 바로 이어서 다음 순위를 매기게 됩니다. ROW_NUMBER 함수는 무조건 유니크(Unique) 한 순위를 매깁니다.

RANK 함수는 순위를 구하는 함수입니다. 특정 범위 안에서의 순위를 구할 수도 있고 전체 데이터에 대한 순위를 구할 수 있습니다. 동일한 값에 대해서는 동일한 순위를 부여 하는 함수입니다.

RANK는 순위를 매기면서 같은 순위가 존재하게 되면 존재하는 수 만큼 다음 순위를 건너뛰게 됩니다.


[RANK 함수 사용 예시]

SELECT 컬럼1, COUNT(*)
RANK () OVER (ORDER BY COUNT(*) DESC) AS RANK
FROM 테이블1
GROUP BY 컬럼1 ;

DENSE_RANK 함수는 RANK 함수와 비슷하지만 동일한 순위를 하나의 건수로 취급하는 함수입니다. RANK는 1순위, 2순위, 3순위로 표기되지만 DENSE_RANK 함수는 1, 1, 3 순위와 같이 부여됩니다. 1위가 2개이기 때문에 2위가 없어지고 3위로 이어지게 됩니다.

DENSE_RANK는 순위를 매기면서 같은 순위가 존재하더라도 다음 순위를 건너 뛰지 않고 이어서 매기는 형태의 함수입니다. DENSE는 사전적으로 “밀집한” 이라는 의미를 가지고 있습니다. 따라서 DENSE_RANK는 순위가 밀집되어 있다라는 의미로 이해할 수 있습니다.


[DENSE_RANK 함수 사용 예시]

SELECT 컬럼1, COUNT(*)
DENSE_RANK () OVER (ORDER BY COUNT(*) DESC) AS DENSE_RANK
FROM 테이블1
GROUP BY 컬럼1 ;

ROW_NUMBER 함수는 동일한 값이더라도 고유한 순위를 부여하는 함수입니다. 동일한 순위를 배제하며 유니크(Unique) 한 순위를 정합니다. 따라서 같은 값에 대해서는 어떤 결과가 먼저 나오게 할지 순서를 정하고자 한다면 ORDER BY를 같이 기재합니다.

ROW_NUMBER는 순위를 매기면서 동일한 값이더라도 각각 다른 순위를 부여하는 것입니다.


[ROW_NUMBER 함수 사용 예시]

SELECT 컬럼1, COUNT(*)
ROW_NUMBER () OVER (ORDER BY COUNT(*) DESC) AS ROW_NUMBER
FROM 테이블1
GROUP BY 컬럼1 ;




2. 집계 함수

집계 함수에는 SUM, MAX, MIN, AVG, COUNT가 있습니다.

SUM 함수는 데이터의 합계를 구하는 함수입니다. SUM 은 인자 값으로 숫자만 올 수 있습니다. SUM 함수를 사용하여 파티션별 윈도우의 합을 구할 수 있습니다. OVER 절에 ORDER BY 절을 추가하여 파티션 내에서 데이터를 정렬하고 이전 데이터까지의 누적 값을 출력하는 형태로 사용될 수 있습니다.

MAX 함수는 데이터의 최대 값을 구하는 함수입니다. MAX 함수를 사용하여 파티션별 윈도우의 최대값을 구할 수 있게 됩니다.

MIN 함수는 데이터의 최소 값을 구하는 함수입니다. 파티션별 윈도우의 최소값을 구할 수 있습니다.

AVG 함수는 데이터의 평균 값을 구하는 함수입니다. 파티션별 통계 값을 구할 수 있습니다.

COUNT 함수는 데이터의 건수를 구하는 함수입니다. COUNT 함수는 정말 많이 사용하는 함수입니다.




3. 행 순서 함수

행 순서 함수에는 FIRST_VALUE, LAST_VALUE, LAG, LEAD가 있습니다.

FIRST_VALUE 함수는 피티션별 가장 선두에 위치한 데이터를 구하는 함수입니다. 파티션별 윈도우에서 가장 먼저 나온 값을 구할 수 있습니다. FIRST_VALUE 함수는 MIN 함수와 동일한 결과를 출력합니다.

LAST_VALUE 함수는 파티션별 가장 끝에 위치한 데이터를 구하는 함수입니다. 파티션별 윈도우에서 가장 먼저 나중에 나온 값을 구할 수 있습니다. LAST_VALUE 함수는 MAX 함수를 사용해도 동일한 결과를 얻을 수 있습니다.

LAG 함수는 파티션 별로 특정 수만큼 앞선 데이터를 구하는 함수입니다. 파티션별로 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있습니다.

LEAD 함수는 파티션별 특정 수만큼 뒤에 있는 데이터를 구할 수 있는 함수입니다. 파티션별 윈도우에서 이후 몇 번째 행의 값을 가져올 수 있습니다.




4. 비율 함수

비율 함수에는 CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT가 있습니다.

CUME_DIST 함수는 해당 파티션에서 누적 백분율을 구하는 함수입니다. 파티션별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 구하게 됩니다.

PERCENT_RANK 함수는 해당 파티션의 맨 위 끝 행을 0으로 하고 맨 아래 끝 행을 1로 놓고 현재 행이 위치하는 백분위 순위 값을 구하는 함수입니다. PERCENT_RANK 함수는 파티션별 함수를 사용하여 파티션별 윈도우에서 가장 먼저 나오는 것을 0으로 하고 가장 마지막으로 오는 것을 1로 하여 행의 순서별 백분율을 구하는 것입니다. 즉 결과적으로 값이라기 보다 행의 순서별 백분율이 됩니다.

NTILE 함수는 주어진 수만큼 행들을 n 등분한 다음 현재 행에 해당하는 등급을 구하는 함수입니다. NTILE 함수는 파티션별 전체 건수를 ARGUMENT 값으로 n 등분한 결과를 구할 수 있게 됩니다.

RATIO_TO_REPORT 함수는 파티션 별 합계에서 차지하는 비율을 구하는 함수입니다. RATIO_TO_REPORT 함수는 파티션 안의 전체 SUM 값에 대한 행 별 컬럼 값의 백분율을 소수점으로 구할 수 있습니다.