Search

윈도우 함수(Window Function)

대분류
DB
소분류
MySQL
주요 레퍼런스
https://autumn-irene.tistory.com/67
https://mizykk.tistory.com/121
https://jie0025.tistory.com/85
수준
심화
태그
RANK
ROWNUMBER
NTILE
LEAD
LEG
최종 편집 일시
2024/10/27 15:23
생성 일시
2024/09/28 15:44
13 more properties

윈도우 함수

분석 함수(Analytic Functions): SQL 쿼리의 성능을 한 단계 높이는 강력한 도구, 단순히 데이터를 처리하는 것을 넘어, 데이터 분석과 쿼리 최적화에 있어 핵심적인 역할을 함.
Row별로 세부적인 계산을 가능하게 한다.
전체 데이터에 걸쳐 다양한 통계와 계산을 유연하게 수행할 수 있게 도와준다.
데이터베이스를 사용한 온라인 분석처리 용도 ︎ OLAP(Online Analytical Processing)함수
GROUP BY절 사용 불가  PARTITION BY로 구간 설정하여 사용
PARTITION BYGROUP BY와 같은 집약기능이 없기때문에 레코드가 줄어들지 않음. 그저 함수 적용 범위를 묶는 역할
윈도우 함수는 반드시 OVER과 함께 사용
기본 분석함수 사용법
SELECT ANALYTIC_FUNCTION(args) OVER ( [PARTITION BY 컬럼] [ORDER BY 컬럼] [WINDOWING절(ROWS | RANGE BETWEEN)] ) FROM 테이블명;
SQL
복사
ANALYTIC FUNCTION: 분석함수명(입력인자)
OVER: 분석함수임을 나타내는 키워드
PARTITION BY: 계산 대상 그룹 지정 >>GROUP BY와 비슷한 역할. 이 구문이 없으면 전체 데이터에 대해 계산이 적용됨.
ORDER BY: 대상 그룹에 대한 정렬 수행
WINDOWING 절 : 분석함수의 계산 대상 범위 지정
(ORDER BY절에 종속적. 기본 생략 구문 : 정렬된 결과의 처음~현재행까지)
분석/윈도우 함수
설명
RANK()
동일한 값이 있을 경우 동일한 순위를 부여하고, 그 다음 순위를 건너뜀
DENSE_RANK()
동일한 값에 동일한 순위를 부여하지만, 그 다음 순위를 건너뛰지 않음
ROW_NUMBER()
각 행에 대해 고유한 순번을 부여
NTILE(N)
결과를 N개의 동일한 크기로 나누고 각 행에 그룹 번호를 부여
LEAD(열, N, 결측값 채울 값)
현재 행을 기준으로 이후 행의 값을 참조
LAG(열, N, 결측값 채울 값)
현재 행을 기준으로 이전 행의 값을 참조
FIRST_VALUE()
파티션 또는 그룹 내에서 정렬된 결과에서 첫 번째 값을 반환
LAST_VALUE()
파티션 또는 그룹 내에서 정렬된 결과에서 마지막 값을 반환
CUME_DIST()
누적 분포를 계산하여 특정 값 이하의 행이 집합에서 차지하는 비율을 반환
PERCENT_RANK()
현재 행이 전체 집합에서 차지하는 백분위 순위를 반환
NTH_VALUE()
파티션 또는 그룹에서 정렬된 결과 중 N번째 값을 반환
소계 : 전체가 아닌 어느 한 부분만을 셈한 합계
합계 ≒ 계 : 한데 합하여 계산함
총계 : 전체를 한데 모아서 계산함.

순위

RANK() : 중복 가능, 공동 순위만큼 건너뜀
DENSE_RANK() : 중복 가능, 공동 순위가 있더라도 순차적으로 순위 생성
ROW_NUMBER() : 중복 없는 순위, 행 번호
SELECT val -- 행 번호 , ROW_NUMBER() OVER (ORDER BY val) AS 'row_number' -- 순위 , RANK() OVER (ORDER BY val) AS 'rank' -- 순위 : 순차적 , DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank' FROM table
SQL
복사
ORDER BY에 순위의 기준을 지정한다.
인자가 들어가지 않는다.
NTILE(N) : 파티션 분할, 지정된 N 만큼의 등급으로 나누어 각 등급 번호를 출력
SELECT NTILE(2) OVER(ORDER BY height DESC) "반번호", userName, addr, height FROM userTBL;
SQL
복사
전체 인원을 키순 정렬 후 2개의 그룹으로 분할

다음 행의 값 찾기

LAG(열, N=1, 결측값 채울 값) : 해당 열을 N칸 미루기
LEAD(열, N=1, 결측값 채울 값) : 해당 열을 N칸 당기기
ORDER BY에서 사용할 열과 대상 열이 SELECT문에서 존재해야 한다.
SELECT Id , RecordDate -- ORDER 열 , Temperature -- 대상 열 -- 미루기 , LAG(Temperature) OVER (ORDER BY RecordDate) AS 'lag' -- 당기기 , LEAD(Temperature) OVER (ORDER BY RecordDate) AS 'lead' FROM table
SQL
복사
PARTITION BY에 그룹할 기준을 지정한다.
ORDER BY에 정렬 기준을 지정한다.