728x90
반응형
윈도우 함수
- 서로 다른 행의 비교나 연산을 위해 만든 함수
- GROUP BY를 쓰지 않고 그룹 연산 가능
- LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, RANG
PARTITION BY절
- 출력 할 총 데이터 수 변화 없이 그룹연산을 수행할 GROUP BY 컬럼
ORDER BY절
- RANK의 경우 필수
- 정렬 컬럼 및 정렬 순서에 따라 순위 변화
- SUM, AVG, MIN, MAX, COUNT 등은 누적값 출력 시 사용
ROWS|RANGE BETWEEN A AND B
- 연산 범위 설정
- ORDER BY절 필수
PARTITION BY, ORDER BY, ROWS ... 절 전달 순서 중요!
(ORDER BY를 PARTITION BY 전에 사용 불가)
윈도우 함수가 필요한 이유 (그룹 함수의 오류)
전체를 출력하는 컬럼과 그룹함수 결과는 함께 출력할 수 없음
그룹 함수의 형태
- SUM, COUNT, AVG, MIN, MAX 등
- OVER 절을 사용하여 윈도우 함수로 사용 가능
- 반드시 연산할 대상을 그룹함수의 입력값으로 전달
1) SUM OVER()
전체 총 합, 그룹별 총 합 출력 가능
2) AVG OVER()
SUM과 동일하게 사용
3) MIN/MAX OVER()
SUM과 동일하게 사용
4) COUNT
SUM과 동일하게 사용
윈도우 함수의 연산 범위: 집계 연산 시 행의 범위 설정 가능
1) ROWS, RANGE 차이
- ROWS: 값이 같더라도 각 행 씩 연산
- RANGE: 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산(DEFAULT)
2) BETWEEN A AND B
A: 시작점 정의
- CURRENT ROW : 현재 행부터
- UNBOUNDED PRECEDING: 처음부터 (default)
- N PRECEDING: N 이전부터
B: 마지막 시점 정의
- CURRENT ROW: 현재 행까지 (default)
- UNBOUNDED FOLLOWING: 마지막까지
- N FOLLOWING: N 이후까지
예시) UNBOUNDED PRECEDING AND 1 FOLLOWING: 각 행마다 누적 합 계산 시 처음부터 다음 행까지 연산
순위 관련 함수
RANK 함수는 ORDER BY를 포함한 QUERY 문에서 특정 항목(컬럼)에 대한 순위를 구하는 함수이며, 동일한 값에 대해서는 동일한 순위를 부여한다.
- RANK WITHIN GROUP
- 특정 값에 대한 순위 확인
- 윈도우 함수가 아닌 일반 함수
RANK 함수 문장
- RANK() OVER()
- 전체/특정 그룹 중 값의 순위 확인
- ORDER BY절 필수
- 순위를 구할 대상을 ORDER BY절에 명시 (여러 개 나열 가능)
- 그룹 내 순위를 구할 경우 PARTITION BY 절 사용
RANK() OVER() 문장
- DENSE_RANK
- 누적 순위
- 값이 같을 때 동일한 순위 부여 후 다음 순위가 바로 이어지는 순위 부여 방식
- 1등이 5명이더라도 그 다음 순위가 2등으로 부여됨
- RANK 함수와 흡사하나, 동일한 순위를 하나의 건수로 취급하는 것이 다른 점이다.
- ROW_NUMBER
- 연속된 행 번호
- 동일한 순위를 인정하지 않고 단순히 순서대로 나열한대로의 순서 값 리턴
- RANK나 DENSE_RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는 반면, ROW_NUMBER은 동일한 값이라도 고유한 순위를 부여한다.
- LAG, LEAD
- 행 순서대로 각각 이전 값(LAG), 이후 값(LEAD) 가져오기
- LAG 함수를 이용해 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다.
- 이후 몇 번째 행의 값을 가져오는 것은 LEAD 함수이며, SQL Server에서는 지원하지 않는 함수이다.
- ORDER BY 절 필수
LAG, LEAD 문장
- 행 순서대로 각각 이전 값(LAG), 이후 값(LEAD) 가져오기
- FIRST_VALUE, LAST_VALUE
- 정렬 순서대로 정해진 범위에서의 처음 값, 마지막 값 출력
- 순서와 범위 정의에 따라 최솟값/최댓값 리턴 가능
- NTILE
- 행을 특정 컬럼 순서에 따라 정해진 수의 그룹으로 나누기 위한 함수
- N등분 한 뒤 부여된 그룹 번호가 리턴됨
- ORDER BY 필수
- PARTITION BY를 사용하여 특저 그룹을 추가로 원하는 수 만큼 그룹 분리 가능
NTILE 문장
비율 관련 함수
- RATIO_TO_REPORT
- 각 값의 비율 리턴 (전체 비율 또는 특정 그룹 내 비율 가능)
- ORDER BY 사용 불가
RATIO_TO_REPORT 문장
- CUME_DIST
- 각 값의 누적 비율 리턴 (전체 비율 또는 특정 그룹 내 비율 가능
- ORDER BY 필수 (누적 비율을 구하는 순서를 정할 수 있음)
CUME_DIST() 문장
- PERCENT_RANK
- PERCENTILE (분위수) 출력
- 전체 COUNT 중 상대적 위치 출력 (0~1 범위 내)
- ORDER BY 필수
PERCENT_RANK() 문장
반응형
'[DB]DataBase > [SQL]' 카테고리의 다른 글
[SQLD] 계층형 질의와 셀프 조인 (0) | 2024.05.19 |
---|---|
[SQLD] Top N 쿼리 (0) | 2024.05.18 |
[SQLD] 그룹 함수 (0) | 2024.05.09 |
[SQLD] 집합 연산자 (0) | 2024.05.06 |
[SQLD] 서브 쿼리 (0) | 2024.05.05 |