SQL - 내장 함수(Built-in Function)
함수(Function)
함수(Function)
는 데이터베이스에서 입력값을 처리하여 결과값을 반환하는 프로그램으로, 크게 밴더에서 제공하는 내장 함수(Built-in Function)
와 사용자가 작성하는 사용자 정의 함수(User Defined Function)
로 나눌 수 있습니다.
이번 시간에는 내장 함수를 알아보고자 합니다. 내장 함수는 단일 행 값을 입력하여 단일 값을 반환하는 단일 행 함수(Single-Row Function)
, 다중 행 값을 입력하여 단일 값을 반환하는 다중 행 함수(Multi-Row Function)
으로 나눌 수 있습니다.
단일 행 함수
단일 행 함수
의 유형은 문자형 함수
, 숫자형 함수
, 날짜형 함수
, 형 변환 함수
, NULL 관련 함수
가 있습니다.
문자형 함수
문자형 함수
는 문자 또는 문자열을 입력받아 처리하는 함수로, SELECT, WHERE, ORDER BY절에서 사용할 수 있습니다.
문자형 함수
함수 | 내용 |
---|---|
LOWER(문자열) | 문자열을 소문자로 변환합니다. |
UPPER(문자열) | 문자열을 대문자로 변환합니다. |
INITCAP(문자열) | 문자열의 첫 문자를 대문자로 변환합니다. (Pascal Case) |
ASCII(문자) | 문자를 아스키 코드로 변환합니다. |
CHR(아스키 코드) | 아스키 코드를 문자로 변환합니다. SQL Server에서는 CHAR() 를 사용합니다. |
CONCAT(문자열1, 문자열2) | 문자열1과 문자열2를 연결합니다. '문자열1' | | '문자열2' 와 같습니다. |
SUBSTR(문자열, 시작위치[, 길이]) | 문자열의 시작위치에서 길이만큼 반환하며, 길이를 생략하면 마지막 문자열까지 반환합니다. 시작위치를 음수로 입력하면 오른쪽 방향으로 계산하여 출력되며, SQL Server에서는 SUBSTRING() 을 사용합니다. |
LENGTH(문자열) | 문자열의 길이를 출력합니다. 바이트를 반환하려면 LENGTHB() 를 사용하며, SQL Server에서는 LEN() 을 사용합니다. |
LTRIM(문자열[, 지정문자]) | 문자열의 왼쪽에서 연속되는 지정문자를 제거하며, 지정문자가 생략되면 공백을 제거합니다. |
RTRIM(문자열[, 지정문자]) | 문자열의 오른쪽에서 연속되는 지정문자를 제거하며, 지정문자가 생략되면 공백을 제거합니다. |
TRIM([LEADING | TRAILING | BOTH] [지정문자 FROM] 문자열) |
문자열의 머릿말, 꼬릿말 또는 양쪽에서 지정문자를 제거하며, 지정문자를 생략하면 공백을 제거합니다. |
LPAD(문자열, 길이[, 채움문자]) | 길이만큼 문자열의 왼쪽에 채움문자를 채우며, 채움문자를 생략하면 공백을 채웁니다. |
RPAD(문자열, 길이[, 채움문자]) | 길이만큼 문자열의 오른쪽에 채움문자를 채우며, 채움문자를 생략하면 공백을 채웁니다. |
REPLACE(문자열, 지정문자열, 변환문자열) | 문자열에서 지정문자열을 변환문자열로 변경합니다. |
TRANSLATE(문자열, 지정문자열, 변환문자열) | REPLACE와 유사하며, 지정문자열의 한글자씩 변환문자열에 매핑하여 문자열을 변경합니다. |
숫자형 함수
숫자형 함수
는 수치형 데이터를 입력받아 처리하는 함수입니다.
숫자형 함수
함수 | 내용 |
---|---|
ABS(숫자) | 숫자의 절대값을 반환합니다. |
SIGN(숫자) | 숫자가 양수이면 1, 음수이면 -1, 0이면 0을 반환합니다. |
MOD(숫자1, 숫자2) | 숫자1을 숫자2로 나눈 나머지를 반환합니다. |
CEIL(숫자) | 숫자의 올림값을 반환합니다. |
FLOOR(숫자) | 숫자의 내림값을 반환합니다. |
ROUND(숫자[, 소수점자리수]) | 숫자를 소수점 자릿수에서 반올림합니다. 소수점자리수를 생략하면 기본값으로 0이 적용됩니다. |
TRUNC(숫자[, 소수점자리수]) | 숫자의 소수점 자릿수 뒷자리를 버립니다. |
날짜형 함수
날짜형 함수는 DATE 타입의 데이터를 계산합니다.
날짜형 함수
함수 | 내용 |
---|---|
SYSDATE | 현재 날짜와 시간을 반환합니다. SQL Server에서는 GETDATE() 를 사용합니다. |
EXTRACT (YEAR | MONTH | DAY FROM 날짜) |
날짜에서 년(YEAR), 월(MONTH), 일(DAY)을 추출합니다. SQL Server에서는 DATEPART() 를 사용합니다. |
형 변환 함수
형 변환 함수는 데이터 타입을 변환하기 위해 사용하는 함수입니다.
형 변환 함수
함수 | 내용 |
---|---|
TO_NUMBER(문자열) | 문자열을 숫자로 변환합니다. |
TO_CHAR(숫자 | 날짜[, 포맷]) | 숫자 또는 날짜를 포맷에 맞는 문자열로 변환합니다. |
TO_DATE(문자열[, 포맷]) | 문자열을 포맷에 맞는 날짜 타입으로 변환합니다. |
NULL 관련 함수
NULL 관련 함수
눈 정해지지 않은 값을 의미하며, 과 관련된 함수는 다음과 같습니다.
NULL 관련 함수
함수 | 내용 |
---|---|
NVL(표현식1, 표현식2) | 표현식1이 NULL이면 표현식2를 반환합니다. SQL Server에서는 ISNULL() 을 사용합니다. |
NVL2(표현식1, 표현식2, 표현식3) | 표현식1이 NULL이 아니면 표현식2를, NULL이면 표현식3을 반환합니다. |
IFNULL(표현식1, 표현식2) | 표현식1과 표현식2가 같으면 NULL을, 같지않으면 표현식1을 반환합니다. |
COALESE(표현식1, 표현식2, …) | 표현식 중 NULL이 아닌 첫번째 값을 반환합니다. |
다중 행 함수
다중 행 함수의 유형은 집계 함수, 그룹 함수, 윈도우 함수가 있습니다.
집계 함수
집계 함수는 특정 컬럼에 대한 행들의 값을 통계적으로 계산한 결과를 반환하는 함수입니다. SELECT절, HAVING절, GROUP BY절에 사용할 수 있으며, 값은 제외하고 계산됩니다.
집계 함수
함수 | 내용 |
---|---|
COUNT(*) | 값을 포함한 컬럼 전체 행의 수를 반환합니다. |
COUNT(컬럼 | 표현식) | 값을 제외한 컬럼이나 표현식에 해당하는 행의 수를 반환합니다. |
SUM(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값의 합계를 반환합니다. |
AVG(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값의 평균을 반환합니다. |
MAX(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값 중 최대값을 반환합니다. |
MIN(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값 중 최소값을 반환합니다. |
STDDEV(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값들의 표준편차를 반환합니다. |
VARIANCE(컬럼 | 표현식) | 컬럼이나 표현식에 해당하는 값들의 분산을 반환합니다. |
그룹 함수
그룹 함수는 데이터를 그룹화하고 각 그룹 내의 데이터를 분석하는 데 사용되는 함수입니다. SELECT
문에서 사용되며 일반적으로 GROUP BY
구문과 함께 사용됩니다.
(1) ROLLUP 함수
ROLLUP
함수는 지정된 컬럼의 소계 및 총계를 구하기 위해 사용하는 그룹 함수입니다. 각 열을 기준으로 데이터를 그룹화하고, 각 그룹에 대해 집계 연산을 수행한 다음, 상위 수준에서도 그룹화 및 집계를 수행합니다.
ROLLUP 함수 구문
SELECT 컬럼명, 집계 함수
FROM 테이블명
GROUP BY ROLLUP(컬럼1, 컬럼2);
해당 그룹함수는 다음과 같은 행의 합집합과 같습니다.
ROLLUP 함수를 합집합으로 표현
GROUP BY ROLLUP(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
전체 집합 결과
예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다.
ROLLUP 함수 예제 데이터
지역 | 부서 | 금액 |
---|---|---|
서울 | 마케팅 | 1000 |
서울 | 영업 | 2000 |
부산 | 마케팅 | 1500 |
부산 | 영업 | 2500 |
위의 데이터에서, 이름, 성별, 국가별 판매량을 계산하고 싶다고 가정해 봅시다. 이를 수행하기 위해 ROLLUP 함수를 사용할 수 있습니다. 다음 SQL 문은 이름, 성별, 국가를 기준으로 판매량을 계산하고, ROLLUP 함수를 사용하여 계층 구조를 만듭니다.
ROLLUP 함수 예제
SELECT 지역, 부서, SUM(금액)
FROM 테이블명
GROUP BY ROLLUP(지역, 부서);
이 구문을 사용하여, 지역별 금액 합계, 부서별 금액 합계, 전체 금액 합계를 각각 계산할 수 있습니다.
아래는 위의 SQL 문의 결과입니다.
ROLLUP 함수 예제 결과
지역 | 부서 | SUM(금액) |
---|---|---|
서울 | 마케팅 | 1000 |
서울 | 영업 | 2000 |
서울 | 3000 | |
부산 | 마케팅 | 1500 |
부산 | 영업 | 2500 |
부산 | 4000 | |
7000 |
(2) CUBE 함수
CUBE
함수는 다차원 그룹화를 수행하기 위한 기능입니다. ROLLUP 함수와 마찬가지로 GROUP BY 절에 사용되며, 여러 열을 기준으로 데이터를 그룹화하고 각 그룹 단위의 합계를 계산합니다. 하지만, ROLLUP 함수와 달리 CUBE 함수는 모든 가능한 조합에 대한 그룹 단위의 합계를 계산합니다.
CUBE 함수는 내부적으로 대상 컬럼의 순서를 변경하여 쿼리를 수행하기 때문에 다른 그룹 함수보다 시스템에 대한 부하가 크므로 사용시 주의해야 합니다.
CUBE 함수 구문은 다음과 같습니다.
CUBE 함수 구문
SELECT 컬럼명, 집계 함수
FROM 테이블명
GROUP BY CUBE(컬럼1, 컬럼2);
해당 그룹함수는 다음과 같은 행의 합집합과 같습니다.
CUBE 함수를 합집합으로 표현
GROUP BY CUBE(컬럼1, 컬럼2)
=
GROUP BY 컬럼1, 컬럼2
UNION ALL
GROUP BY 컬럼1
UNION ALL
GROUP BY 컬럼2
UNION ALL
전체 집합 결과
예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다.
CUBE 함수 예제 데이터
날짜 | 지역 | 부서 | 금액 |
---|---|---|---|
2022-01-01 | 서울 | 마케팅 | 1000 |
2022-01-01 | 서울 | 영업 | 2000 |
2022-01-01 | 부산 | 마케팅 | 1500 |
2022-01-01 | 부산 | 영업 | 2500 |
2022-01-02 | 서울 | 마케팅 | 1200 |
2022-01-02 | 서울 | 영업 | 1800 |
2022-01-02 | 부산 | 마케팅 | 1600 |
2022-01-02 | 부산 | 영업 | 2400 |
위의 데이터에서, 날짜, 지역, 부서별로 금액의 합계를 계산하려면 다음과 같은 SQL 문을 사용할 수 있습니다.
CUBE 함수 예제
SELECT 날짜, 지역, 부서, SUM(금액)
FROM 테이블명
GROUP BY CUBE(날짜, 지역, 부서);
이 구문을 사용하여, 지역별 금액 합계, 부서별 금액 합계, 전체 금액 합계를 각각 계산할 수 있습니다.
아래는 위의 SQL 문의 결과입니다.
CUBE 함수 결과
날짜 | 지역 | 부서 | SUM(금액) |
---|---|---|---|
14000 | |||
영업 | 8700 | ||
마케팅 | 5300 | ||
부산 | 8000 | ||
부산 | 영업 | 4900 | |
부산 | 마케팅 | 3100 | |
서울 | 6000 | ||
서울 | 영업 | 3800 | |
서울 | 마케팅 | 2200 | |
2022-01-01 | 7000 | ||
2022-01-01 | 영업 | 4500 | |
2022-01-01 | 마케팅 | 2500 | |
2022-01-01 | 부산 | 4000 | |
2022-01-01 | 부산 | 영업 | 2500 |
2022-01-01 | 부산 | 마케팅 | 1500 |
2022-01-01 | 서울 | 3000 | |
2022-01-01 | 서울 | 영업 | 2000 |
2022-01-01 | 서울 | 마케팅 | 1000 |
2022-01-02 | 7000 | ||
2022-01-02 | 영업 | 4200 | |
2022-01-02 | 마케팅 | 2800 | |
2022-01-02 | 부산 | 4000 | |
2022-01-02 | 부산 | 영업 | 2400 |
2022-01-02 | 부산 | 마케팅 | 1600 |
2022-01-02 | 서울 | 3000 | |
2022-01-02 | 서울 | 영업 | 1800 |
2022-01-02 | 서울 | 마케팅 | 1200 |
(3) GROUPING SETS 함수
GROUPING SETS
함수는 다중 그룹화를 수행하기 위한 기능입니다. ROLLUP 함수 및 CUBE 함수와 비슷하지만, GROUPING SETS 함수는 그룹화에 대한 집합을 명시적으로 지정할 수 있습니다.
GROUPING SETS 함수는 GROUP BY 절에 사용되며, 다중 열을 기준으로 데이터를 그룹화하고 각 그룹 단위의 합계를 계산합니다.
ROLLUP 함수나 CUBE 함수처럼 모든 가능한 조합을 계산하지 않고, 사용자가 지정한 그룹의 소계만 계산합니다. 또한 ROLLUP 함수와 달리 컬럼 간 순서와 무관한 결과를 얻을 수 있습니다.
GROUPING SETS 함수의 구문은 다음과 같습니다.
GROUPING SETS 함수 구문
SELECT 컬럼명, 집계 함수
FROM 테이블명
GROUP BY GROUPING SETS(컬럼1, 컬럼2);
해당 그룹함수는 다음과 같은 행의 합집합과 같습니다.
GROUPING SETS 함수를 합집합으로 표현
GROUP BY GROUPING SETS(컬럼1, 컬럼2)
=
GROUP BY 컬럼1
UNION ALL
GROUP BY 컬럼2
예를 들어, 다음과 같은 데이터가 있다고 가정해 봅시다.
GROUPING SETS 함수 예제 데이터
날짜 | 지역 | 부서 | 금액 |
---|---|---|---|
2022-01-01 | 서울 | 마케팅 | 1000 |
2022-01-01 | 서울 | 영업 | 2000 |
2022-01-01 | 부산 | 마케팅 | 1500 |
2022-01-01 | 부산 | 영업 | 2500 |
2022-01-02 | 서울 | 마케팅 | 1200 |
2022-01-02 | 서울 | 영업 | 1800 |
2022-01-02 | 부산 | 마케팅 | 1600 |
2022-01-02 | 부산 | 영업 | 2400 |
위의 데이터에서, 날짜, 지역, 부서별로 금액의 합계를 계산하려면 다음과 같은 SQL 문을 사용할 수 있습니다.
GROUPING SETS 함수 예제
SELECT 날짜, 지역, 부서, SUM(금액)
FROM 테이블명
GROUP BY GROUPING SETS((날짜), (지역), (부서));
위의 SQL 문에서, GROUPING SETS 구문은 그룹화에 대한 집합을 명시적으로 지정합니다. GROUPING SETS 구문 안에는 그룹화에 사용할 열을 나열하며, 각각을 괄호로 묶어서 집합으로 표시합니다.
아래는 위의 SQL 문의 결과입니다.
GROUPING SETS 함수 결과
날짜 | 지역 | 부서 | SUM(금액) |
---|---|---|---|
2022-01-01 | 7000 | ||
2022-01-02 | 7000 | ||
서울 | 6000 | ||
부산 | 8000 | ||
마케팅 | 5300 | ||
영업 | 8700 |
윈도우 함수
윈도우 함수(Window Function)
는 OVER 절을 사용하여 데이터 집합을 기반으로 계산되는 함수입니다. 집계 함수와 달리 그룹화하지 않고 개별 행에 대해 계산합니다. 각 행의 계산 결과는 해당 행의 윈도우(Window)에 속하는 모든 행의 값을 사용하여 계산됩니다.
윈도우 함수를 사용하면 데이터 집합에서 개별 행에 대한 값을 계산하는 것이 가능합니다. 일반적으로, 윈도우 함수는 데이터 집합에서 일부 행에 대한 통계를 계산하기 위해 사용됩니다. 윈도우 함수는 행과 행 사이에서 연산을 수행하고 결과 집합에 포함될 행을 결정하는 데 사용됩니다.
데이터베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해 추가된 기능으로 OLAP(On-Line Analytical Processing)
함수라고도 합니다.
윈도우 함수는 다음과 같은 구문을 가집니다.
윈도우 함수 구문
SELECT 윈도우함수(인수) OEVER (
[PARTITION BY 컬럼1 [, 컬럼2 ...]]
[ORDER BY 컬럼1 [ASC|DESC] [, 컬럼2 [ASC, DESC] ...]]
[WINDOWING절] )
FROM 테이블명;
윈도우 함수를 사용하려면 OVER() 구문을 사용하여 윈도우를 정의해야 합니다. 윈도우는 연산을 수행할 데이터의 범위를 지정하며, 연산 범위는 WINDOWING절에서 ROWS
나 RANGE
로 정의됩니다. ROWS는 행 수로, RANGE는 값의 범위로 윈도우를 정의합니다. ROWS나 RANGE 구문 뒤에는 윈도우 크기를 나타내는 값이 올 수 있습니다.
WINDOWING절은 다음과 같은 구문을 가집니다.
WINDOWING절 구문
[ROWS|RANGE] BETWEEN 시작점 AND 끝점;
시작점은 다음과 같은 키워드를 사용할 수 있습니다.
키워드 | 설명 |
---|---|
UNBOUNDED PRECEDING | 최초의 레코드 |
CURRENT ROW | 현재의 레코드 |
값 PRECEDING | 값만큼 이전의 레코드 |
값 FOLLOWING | 값만큼 이후의 레코드 |
끝점은 다음과 같은 키워드를 사용할 수 있습니다.
키워드 | 설명 |
---|---|
UNBOUNDED FOLLOWING | 마지막 레코드 |
CURRENT ROW | 현재의 레코드 |
값 PRECEDING | 값만큼 이전의 레코드 |
값 FOLLOWING | 값만큼 이후의 레코드 |
WINDOWING절을 명시하지 않는 경우 기본값으로 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
가 적용됩니다.
윈도우 함수의 유형에는 순위 함수
, 집계 함수
, 순서 함수
, 비율 함수
가 있습니다.
(1) 순위 함수
순위 함수
는 데이터의 순위를 계산하여 출력합니다. 이 때, 데이터가 중복되는 경우 같은 순위를 가지게 됩니다. SQL에서는 다음과 같은 3가지의 순위 함수를 제공합니다.
순위함수 | 설명 |
---|---|
RANK | 데이터의 순위를 계산하고, 같은 값이 있을 경우 중복 순위를 건너뛰고 다음 순위를 출력합니다. |
DENSE_RANK | 데이터의 순위를 계산하고, 같은 값이 있을 경우 중복 순위를 건너뛰지 않고 중복 순위를 포함한 순위를 출력합니다. |
ROW_NUMBER | 데이터의 순서에 따라 순번을 부여합니다. 같은 값이 있을 경우에도 중복되지 않고 각각의 순번을 출력합니다. |
예를 들어, 다음과 같은 SCORES 테이블이 있다고 가정해 봅시다.
순위 함수 예제 데이터
NAME | SCORE |
---|---|
Alice | 80 |
Bob | 80 |
Carol | 75 |
Dave | 70 |
이 테이블에서 NAME 컬럼을 기준으로 정렬된 결과를 가지고, SCORE 컬럼의 누적 합계를 계산하려면 다음과 같이 윈도우 함수를 사용할 수 있습니다.
RANK 함수 예제
SELECT NAME,
SCORE,
RANK() OVER (ORDER BY SCORE DESC) AS RANK
FROM SCORES;
위 쿼리는 SCORES 테이블에서 SCORE 컬럼을 기준으로 내림차순으로 정렬한 결과를 기반으로, 각 데이터의 순위를 계산합니다. RANK() 함수는 동일한 순위를 갖는 데이터가 있을 경우 같은 순위를 부여하고, 그 다음 순위는 건너뛰어 다음으로 높은 순위를 부여합니다. 예를 들어, 첫 번째와 두 번째 데이터는 같은 순위(2위)를 부여하고, 그 다음 데이터는 4위를 부여합니다. 결과는 다음과 같습니다.
RANK 함수 결과
NAME | SCORE | RANK |
---|---|---|
Alice | 80 | 1 |
Bob | 80 | 1 |
Carol | 75 | 3 |
Dave | 70 | 4 |
다음은 DENSE_RANK() 함수를 사용하여 score 열을 기준으로 순위를 계산하는 쿼리의 예제입니다.
DENSE_RANK 함수 예제
SELECT NAME,
SCORE,
DENSE_RANK() OVER (ORDER BY SCORE DESC) AS RANK
FROM SCORES;
위 쿼리는 RANK() 함수와 비슷하게, SCORES 테이블에서 SCORE 컬럼을 기준으로 내림차순으로 정렬한 결과를 기반으로, 각 데이터의 순위를 계산합니다. 하지만 DENSE_RANK() 함수는 동일한 순위를 갖는 데이터가 있을 경우 같은 순위를 부여하고, 그 다음 순위는 건너뛰지 않고 동일한 순위를 부여합니다. 예를 들어, 첫 번째와 두 번째 데이터는 같은 순위(2위)를 부여하고, 그 다음 데이터는 3위를 부여합니다. 결과는 다음과 같습니다.
DENSE_RANK 함수 결과
NAME | SCORE | RANK |
---|---|---|
Alice | 80 | 1 |
Bob | 80 | 1 |
Carol | 75 | 2 |
Dave | 70 | 3 |
마지막으로, ROW_NUMBER() 함수를 사용하여 SCORE 컬럼을 기준으로 순위를 계산하는 쿼리의 예제를 살펴보겠습니다.
ROW_NUMBER 함수 예제
SELECT NAME,
SCORE,
ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS RANK
FROM SCORES;
위 쿼리는 RANK() 함수와 DENSE_RANK() 함수와 달리, 각 데이터를 유일하게 구별하는 번호를 부여합니다. SCORES 테이블에서 SCORE 컬럼을 기준으로 내림차순으로 정렬한 결과를 기반으로, 각 데이터에 대해 1부터 순차적으로 번호를 부여합니다. 결과는 다음과 같습니다.
ROW_NUMBER 함수 결과
NAME | SCORE | RANK |
---|---|---|
Alice | 80 | 1 |
Bob | 80 | 2 |
Carol | 75 | 3 |
Dave | 70 | 4 |
ROW_NUMBER() 함수는 특히 페이징 처리(paging)에 유용합니다. 페이징 처리란, 대량의 데이터를 페이지 단위로 나누어 출력하는 것을 의미합니다. 예를 들어, 위 쿼리 결과에서 첫 번째 페이지에는 1부터 2까지의 데이터를, 두 번째 페이지에는 3부터 4까지의 데이터를 출력할 수 있습니다.
(2) 집계 함수
윈도우 함수의 집계 함수
는 파티션 별 윈도우 내에서 데이터를 그룹화하여 통계적으로 계산한 결과를 반환하는 함수입니다. 전체 데이터셋을 기준으로 계산하는 일반적인 집계 함수와는 달리 더욱 세부적인 집계 결과를 얻을 수 있습니다.
윈도우 함수 중 집계 함수로는 다음과 같은 함수가 있습니다.
집계함수 | 설명 |
---|---|
SUM | 윈도우 내 숫자형 데이터의 합을 계산합니다. |
AVG | 윈도우 내 숫자형 데이터의 평균을 계산합니다. |
MIN | 윈도우 내 숫자형 데이터의 최소값을 계산합니다. |
MAX | 윈도우 내 숫자형 데이터의 최대값을 계산합니다. |
COUNT | 윈도우 내 데이터의 개수를 계산합니다. |
다음과 같은 SCORES 테이블이 있다고 가정해 봅시다.
ID | NAME | SUBJECT | SCORE |
---|---|---|---|
1 | Alice | math | 80 |
2 | Bob | math | 90 |
3 | Alice | math | 95 |
4 | Bob | math | 85 |
5 | Alice | science | 75 |
6 | Bob | science | 80 |
7 | Alice | science | 90 |
8 | Bob | science | 85 |
9 | Alice | english | 70 |
10 | Bob | english | 75 |
11 | Alice | english | 80 |
12 | Bob | english | 85 |
위 테이블에서 윈도우 함수의 집계 함수를 사용하여 SUBJECT를 그룹으로 묶어 각 그룹의 집계 결과를 구할 수 있습니다.
윈도우 함수 중 집계 함수의 예제
SELECT NAME,
SUBJECT,
SCORE,
SUM(SCORE) OVER (PARTITION BY SUBJECT) AS SUBJECT_TOTAL_SCORE,
AVG(SCORE) OVER (PARTITION BY SUBJECT) AS SUBJECT_AVG_SCORE,
MIN(SCORE) OVER (PARTITION BY SUBJECT) AS SUBJECT_MIN_SCORE,
MAX(SCORE) OVER (PARTITION BY SUBJECT) AS SUBJECT_MAX_SCORE,
COUNT(SCORE) OVER (PARTITION BY SUBJECT) AS SUBJECT_COUNT_SCORE
FROM SCORES;
결과는 다음과 같습니다.
NAME | SUBJECT | SCORE | SUBJECT_TOTAL_SCORE | SUBJECT_AVG_SCORE | SUBJECT_MIN_SCORE | SUBJECT_MAX_SCORE | SUBJECT_COUNT_SCORE |
---|---|---|---|---|---|---|---|
Alice | english | 80 | 310 | 77.5 | 70 | 85 | 4 |
Bob | english | 75 | 310 | 77.5 | 70 | 85 | 4 |
Alice | english | 70 | 310 | 77.5 | 70 | 85 | 4 |
Bob | english | 85 | 310 | 77.5 | 70 | 85 | 4 |
Bob | math | 85 | 350 | 87.5 | 80 | 95 | 4 |
Alice | math | 80 | 350 | 87.5 | 80 | 95 | 4 |
Bob | math | 90 | 350 | 87.5 | 80 | 95 | 4 |
Alice | math | 95 | 350 | 87.5 | 80 | 95 | 4 |
Bob | science | 85 | 330 | 82.5 | 75 | 90 | 4 |
Alice | science | 90 | 330 | 82.5 | 75 | 90 | 4 |
Alice | science | 75 | 330 | 82.5 | 75 | 90 | 4 |
Bob | science | 80 | 330 | 82.5 | 75 | 90 | 4 |
(3) 순서 함수
윈도우 함수 중 순서 함수
는 각 행의 이전이나 다음 행의 값을 가져오거나, 윈도우 내에서의 첫 번째나 마지막 값을 가져오는 함수입니다.
윈도우 함수 중 순서 함수로는 다음과 같은 함수가 있습니다.
순서함수 | 설명 |
---|---|
LAG | 윈도우 내에서 이전 행의 값을 반환합니다. |
LEAD | 윈도우 내에서 이후 행의 값을 반환합니다. |
FIRST_VALUE | 윈도우 내에서 첫 번째 값을 반환합니다. |
LAST_VALUE | 윈도우 내에서 마지막 값을 반환합니다. |
다음과 같은 SALES 테이블이 있다고 가정해 봅시다.
ID | DATA | AMOUNT |
---|---|---|
1 | 2022-01-01 | 100 |
2 | 2022-01-02 | 200 |
3 | 2022-01-03 | 300 |
4 | 2022-01-04 | 400 |
5 | 2022-01-05 | 500 |
위 테이블에에서 순서 함수를 사용해 보겠습니다.
윈도우 함수 중 순서 함수의 예제
SELECT ID,
"DATE",
AMOUNT,
LEAD(AMOUNT) OVER (ORDER BY "DATE") AS NEXT_AMOUNT,
LAG(AMOUNT) OVER (ORDER BY "DATE") AS PREV_AMOUNT,
FIRST_VALUE(AMOUNT) OVER (ORDER BY "DATE") AS FIRST_AMOUNT,
LAST_VALUE(AMOUNT) OVER (ORDER BY "DATE") AS LAST_AMOUNT
FROM SALES;
결과는 다음과 같습니다.
ID | DATE | AMOUNT | NEXT_AMOUNT | PREV_AMOUNT | FIRST_AMOUNT | LAST_AMOUNT |
---|---|---|---|---|---|---|
1 | 2022-01-01 | 100 | 200 | 100 | 100 | |
2 | 2022-01-02 | 200 | 300 | 100 | 100 | 200 |
3 | 2022-01-03 | 300 | 400 | 200 | 100 | 300 |
4 | 2022-01-04 | 400 | 500 | 300 | 100 | 400 |
5 | 2022-01-05 | 500 | 400 | 100 | 500 |
파티셔닝을 하지 않았기 때문에 전체 행을 하나로 그룹화 합니다. LEAD와 LAG 함수는 직관적으로 알 수 있을 것입니다. FIRST_VALUE와 LAST_VALUE의 경우 이해가 어려울 수 있는데 앞서 말한 WINDOWING절의 기본값이 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
이기 때문에 이러한 결과가 나왔습니다. 처음 행부터 현재 행까지가 하나의 윈도우가 되기 때문에 FIRST_AMOUNT는 항상 첫 번째 행의 AMOUNT인 100이, LAST_AMOUNT는 현재 행의 AMOUNT가 출력됩니다.
(4) 비율 함수
윈도우 함수 중 비율 함수
는 파티션 내 백분율을 계산하거나 비율에 따라 n등분 할 수 있는 함수입니다.
윈도우 함수 중 비율 함수에는 다음과 같은 함수가 있습니다.
순서함수 | 설명 |
---|---|
RATIO_TO_RERORT | 윈도우 내 SUM 값에 대한 백분율을 계산합니다. |
PERCENT_RANK | 윈도우 내 순서별 백분율을 계산합니다. |
CUME_DIST | 윈도우 내 순서별 누적 백분율을 계산합니다. |
NTILE | 윈도우 내 데이터를 정렬하여 동일한 크기의 버킷으로 분할 한 후 각 버킷에 번호를 할당하는 함수입니다. |
다음과 같은 SALES 테이블이 있다고 가정해 봅시다.
ID | DATA | AMOUNT |
---|---|---|
1 | 2022-01-01 | 100 |
2 | 2022-01-02 | 200 |
3 | 2022-01-03 | 300 |
4 | 2022-01-04 | 400 |
5 | 2022-01-05 | 500 |
위 테이블에에서 비율 함수를 사용해 보겠습니다.
윈도우 함수 중 비율 함수의 예제
SELECT ID,
"DATE",
AMOUNT,
RATIO_TO_REPORT(AMOUNT) OVER () AS AMOUNT_SUM_RATIO,
PERCENT_RANK() OVER (ORDER BY "DATE") AS AMOUNT_RATIO,
CUME_DIST() OVER (ORDER BY "DATE") AS AMOUNT_CUM_DIST
FROM SALES;
RATIO_TO_REPORT 함수는 SUM값을 그룹하기 위한 컬럼을 인수로 설정하고, OVER() 구문에서 ORDER BY절을 사용하지 않습니다.
반면 PERCENT_RANK와 CUME_DIST 함수는 인수가 없으며, OVER() 구문에서 ORDER BY절을 통한 정렬이 필요합니다.
결과는 다음과 같습니다.
ID | DATE | AMOUNT | AMOUNT_SUM_RATIO | AMOUNT_RATIO | AMOUNT_CUM_DIST |
---|---|---|---|---|---|
1 | 2022-01-01 | 100 | 0.0666666667 | 0 | 0.2 |
2 | 2022-01-02 | 200 | 0.1333333333 | 0.25 | 0.4 |
3 | 2022-01-03 | 300 | 0.2 | 0.5 | 0.6 |
4 | 2022-01-04 | 400 | 0.2666666667 | 0.75 | 0.8 |
5 | 2022-01-05 | 500 | 0.3333333333 | 1 | 1 |