SQL

SQL 윈도우 함수

retill28 2024. 8. 15. 01:18

 

 

윈도우 함수란? 

- SQL 쿼리 내에서 데이터 집합을 세분화하여 각 부분에 대한 계산을 수행하는 함수 

- 특정 윈도우 (데이터 내의 부분 집합) 내에서 작동하며 각각의 행에 대해 결과를 반환한다. 

- GROUP BY와의 차이 

윈도우 함수  GROUP BY 
행 기준 연산 :
각 행에 대해 연산을 수행하면서 원본 행의 구조를 유지한다.
그룹기준 연산 :
데이터를 특정의 열의 값에 따라 그룹화, 그룹에 대한 집계 연산을 수행한다. 
다양한 연산 지원   단순 집계 연산 제한 
원본 데이터셋 변경 없음  원본 데이터셋을 축소 
집계와 상세 데이터를 동시에 제공  상세 데이터를 제공할 수 없다. 

 

 

 

 

 

윈도우 함수의 종류는 아래와 같이 구분지을 수 있다.

 

1. 순위 매기기 

-- 동일한 값이 있을 경우 같은 순위를 부여하고, 다음 순위를 건너뛴다.
RANK() OVER (ORDER BY 컬럼명 ASC/DESC) 

-- 동일한 값이 있을 경우 같은 순위를 부여하지만 다음 순위를 건너뛰지 않는다.
DENSE_RANK() OVER (ORDER BY 컬럼명 ASC/DESC) 

-- 순위와 상관없이 각 행에 고유한 번호를 붙인다. 
ROW_NUMBER() OVER (ORDER BY 컬럼명 ASC/DESC)

 

2. 값 호출 

-- 현재 행을 기준으로 n행 뒤의 값을 가져온다.
LEAD(호출할값이있는컬럼명, n, 찾는행이없을때값) OVER (ORDER BY 컬럼명 ASC/DESC)
 
-- 현재 행을 기준으로 n행 앞의 값을 가져온다. 
LAG(호출할값이있는컬럼명, n, 찾는행이없을때값) OVER (ORDER BY 컬럼명 ASC/DESC)
 
-- 파티션으로 나누어진 각 윈도우들의 첫번쨰 값을 가져온다.
FIRST_VALUE(호출할값이있는컬럼명) OVER (ORDER BY 컬럼명 ASC/DESC)
 
-- 파티션으로 나누어진 각 윈도우들의 마지막 값을 가져온다.
LAST_VALUE(호출할값이있는컬럼명) OVER (ORDER BY 컬럼명 ASC/DESC)

 

3. 집계연산 - COUNT, SUM, AVG, MIN, MAX

 

 

 

 

 

 

 

윈도우 함수들의 각 옵션은 다음처럼 3가지로 나눌수 있다.

 

1. PARTITION BY 

- 특정 컬럼을 기준으로 데이터를 부분집합으로 분할한다. 

- 이 부분집합들은 윈도우 함수의 계산 범위를 지정하고, 각 부분집합 내에서 독립적으로 함수가 계산된다. 

- 사용 형태 

함수() OVER (PARTITION BY 컬럼명1, 컬럼명2, ...)

-- 예시
COUNT(*) OVER (PARTITION BY customer_id)

 

 

2. ORDER BY 

- PARTITION BY 뒤에 오는 옵션, 각 부분집합 내에서 데이터 행들의 정렬 순서를 지정

- 순위나 누적 합계 등의 결과에 영향을 준다. 

- 데이터를 정렬기준이 될 컬럼명에 따라 정렬한 다음 그 순서대로 윈도우 함수가 계산되게끔 한다. 

- 사용 형태 

사용함수() OVER (PARTITION BY 분할기준컬럼명 ORDER BY 정렬기준컬럼명

COUNT(*) OVER (PARTITION BY customer_id ORDER BY rental_date)

 

 

3. ROWS / RANGE

- ORDER BY와 함꼐 사용되어, 윈도우 함수가 특정 범위내에서 데이터를 계산하도록 지정한다. 

- ROWS 는 물리적 행의 위치를 기준으로 범위를 정한다. 

- 각 행을 고유하게 취급하며, 정렬된 순서에 따라 정확하게 해당위치의 행들만 포함한다. 

- RANGE는 정렬 키의 값에 따라 범위를 정한다. 

- 값이 중복되는 경우, 그 값에 해당하는 모든 행을 같은 그룹으로 간주한다.

- 예를 들어, RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 라면 시작부터 현재 행까지의 데이터를 말한다. 

UNBOUNDED PRECEDING 파티션의 첫 행부터 시작
UNBOUNDED FOLLOWING 파티션의 마지막 행까지
CURRENT ROW 현재 행 포함
n PRECEDING/FOLLOWING 현재 행에서 n행 앞이나 뒤

 

 

 

 

'SQL' 카테고리의 다른 글

SQL 서브쿼리  (0) 2024.08.08
SQL 명령어 2  (0) 2024.08.08
SQL 함수  (0) 2024.08.01
SQL 쿼리 문법  (0) 2024.08.01
SQL 명령어의 종류  (1) 2024.08.01