일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- dx
- 서평
- 시계열
- 에이블스쿨
- matplot
- Eda
- SQLD
- 빅분기
- 기계학습
- ML
- 한국전자통신연구원
- 가나다영
- 에트리 인턴
- 한국전자통신연구원 인턴
- 프로그래머스
- kt aivle school
- hadoop
- SQL
- 소셜네트워크분석
- arima
- ggplot2
- python
- kaggle
- 빅데이터분석기사
- 머신러닝
- 웹크롤링
- ETRI
- httr
- Ai
- KT 에이블스쿨
- 하둡
- 딥러닝
- 시각화
- r
- cnn
- 하계인턴
- 에이블러
- 다변량분석
- 지도학습
- KT AIVLE
Archives
- Today
- Total
소품집
[SQL 활용] WINDOW FUNCTION (윈도우 함수) 본문
728x90
윈도우 함수란?
- 윈도우 함수는 행과 행 간의 관계를 정의 하기 위해서 제공되는 함수
- 윈도우 함수를 사용해서 순위, 합계, 평균, 행 위치 등을 조작할 수 있다.
- 윈도우 함수는 GROUP BY 구문과 병행하여 사용할 수 없다.
- 윈도우 함수로 인해 결과 건수가 줄어들지 않는다.
- 윈도우 함수의 PARTITION 구문과 GROUP BY 구문은 둘 다 파티션을 분할한다는 의미에서는 유사하다.
- SUM, MAX, MIN 등과 같은 집계 윈도우 함수를 사용할 때 윈도우 절과 함께 사용하면 집계 대상이 되는 레코드 범위를 지정할 수 있다.
윈도우 함수 구조
select window_function(arguments)
over (partition by 칼럼 order by windowing 절)
from 테이블명;
WINDOWING (행 지정)
WINDOWING 예시
전체합계
select empno, ename, sal
sum(sal) over (order by sal
rows between unbounded preceding
and unbounded following) totsal
from emp;
- unbounded preceding은 첫 행을 의미하며, unbounded following은 마지막 행을 의미한다.
- 그러므로 totsal의 처음부터 마지막까지의 합계 (sum(sal))를 계산한 것이다.
누적합계
select empno, ename, sal
sum(sal) over (order by sal
rows between unbounded
- 처음부터 current row(현재까지)의 합계를 계산한다. 즉, 누적합계가 된다.
- 첫 번째 행의 값이 1이었으면 1, 두 번째 행의 값이 2였으면 1+2=3 .. 값이 누적됨!
순위함수 (RANK function)
-
윈도우 함수는 특정 항목과 파티션에 대해서 순위를 계산할 수 있는 함수를 제공한다.
-
순위 함수는 RANK(), DENSE_RANK(), ROW_NUMBER() 함수가 있다.
RANK FUNCTION 예시
내림차순 및 파티션
select ename, sal
rank() over (order by sal desc) all_rank,
dense_rank() over (order by sal desc) dense_rank
from emp;
- RANK() 함수는 순위를 계산하며, 동일한 순위에는 같은 순위가 부여된다.
- 1,2,2,4, ...
- rank() over(order by sal desc)는 sal로 등수를 계산하고, 내림차순으로 조회된다.
- rank() over(partition by
DENSE RANK
select ename, sal
rank() over (order by sal desc) all_rank,
dense_rank() over (order by sal desc) dense_rank
from emp;
- DENSE_RANK는 동일한 순위를 하나의 건수로 인식해서 조회한다.
- 1,2,2,3,4,5,6,7 ...
ROW NUMBER
select ename, sal
rank() over (order by sal desc) all_rank
row_number() over (order by sal) row_num
from emp;
집계 함수 (AGGREGATE function)
집계함수 예시
SUM
select ename, sal
sum(sal) over (partition by mgr) sum_mgr
from emp;
- 같은 관리자(mgr)에 파티션을 만들고 합계(sum)를 계산한다.
행 순서 관련 함수
-
행 순서 관련 함수는 상위 행 값을 하위에 출력하거나 하위 행 값을 상위에 출력할 수 있다.
-
특정 위치의 행을 출력할 수 있다.
행 순서 관련 함수 예시
FIRST_VALUE
select deptno, ename, sal,
first value(ename) over (partition by deptno
order by sal desc rows unbounded preceding) as dept_a
from emp;
부서로 파티션을 나누고, 부서별로 급여가 가장 많은 직원의 이름을 4번째 칼럼에 배치한다.
LAST_VALUE
select deptno, ename, sal,
last_value(ename) over (partition by deptno
order by sal desc rows between current row and
unbounded following) as dept_a
from emp;
- last_value는 마지막 행을 가져온다.
- between current row and unbounded following(=현재 행에서 마지막 행까지의 파티션을 의미)은 부서 내에서 급여가 가장 적은 사람을 가져오는 것이다.
LAG (이전의 값을 가져옴)
select deptno, ename, sal,
lead(sal,2) over (order by sal desc) as pre_sal
from emp;
- lead()함수는 지정된 행의 값을 가지고 오는 것이다.
- 위의 예시는 sal에서 2번째의 행의 값을 가지고 온다.
- lead의 기본값은 1이며, 첫 번째 행의 값을 가지고 온다.
비율 관련 함수
-
비울 관련 함수는 누적 백분율, 순서 백분율, 파티션을 N분으로 분한할 결과 등을 조회할 수 있다.
비율 관련 함수 예시
PERCENT_RANK()
select deptno, ename, sal
percent_rank() over (partition by deptno order by sal desc) as percent_sal
from emp;
- percent_rank() 함수는 파티션에서 등수의 퍼센트를 구하는 함수
- 부서 내의 등수를 백분율을 구한다.
NTILE(n)
select deptno, ename, sal,
ntile(4) over (order by sal desc) as n_title
from emp;
- NTILE은 n등분으로 분할하라는 의미로 위의 예에서는 급여가 높은 순으로 1~4등분으로 분할한다.
select var, count(*) as cnt
from (select ntile(4) over (order by col1) as val
from table_a)
where 1=1
groub by val order by 1
- WHERE 1=1은 참이라는 의미로 사용된다. WHERE 1=2는 거짓이라는 의미이다.
- ORDER BY 1은 첫번째 컬럼을 기준으로 ASC(오름차순) 정렬을 하라는 뜻이다.
- NTILE(4)는 TABLE_A의 COL1의 값을 4개의 파티션으로 나눌 것이다.
728x90
'자격증 > SQL' 카테고리의 다른 글
[SQL 기본] ROWNUM과 ROWID (0) | 2021.03.11 |
---|---|
[SQL 기본] DECODE와 CASE문 (0) | 2021.03.11 |
[SQL 활용] Subquery(서브쿼리) (0) | 2021.03.10 |
[SQL 활용] 계층형 조회 (Connect by) (0) | 2021.03.10 |
[SQL] JOIN(조인) (0) | 2021.03.09 |
Comments