[DB] 분석 함수
<분석 함수>
=SQL 튜닝으로 성능 향상. 쿼리를 간단하게 하여 가독성을 향상
구조
over(partition by ___
order by ___ [ASC|DESC]
Windowing)
🍏 순위 함수
RANK | 우선순위 결정(중복 순위 계산함) |
DENSE_RANK | 우선순위 결정(중복 순위 계산 안함) |
ROW_NUMBER | 모든 행 번호 제공 |
select employee_id, department_id, salary,
rank() over(order by salary desc) sal_rank,
dense_rank() over(order by salary desc) sal_dense_rank,
row_number() over(order by salary desc) sal_number
from employees
oreder by sal_number;
🍏 비율 함수
CUME_DIST | 현재 행 이하 값들 누적 백분위. (값이 현재행 이하인 것 개수 /전체 행 수) |
PERCENT_RANK | 그룹내 순위를 백분위로 표현 (rank-1)/(total_rows-1) |
select salary,
round(cume_dist() over(order by salary ASC),4) sal_cume_dist,
round(percent_Rank() over(order by salary ASC),4) sal_pct_rank
from employees
order by salary;
RATIO_TO_REPORT | 전체 합에 대한 현재 행 비율 계산 (현재행값/전체합) |
select first_name, salary,
round(ratio_to_report(salary) over(),4) as salary_ratio
from employees
where job_id='IT_PROG';
NTILE | 전체 데이터를 n개의 구간으로 나누어 표시. |
ex) salary를 기준으로 10개의 구간으로 나누어라
select employee_id, department_id, salary,
NTILE(10) OVER(order by salary desc) as sal_quart_title
from employees
where department_id=50;
🍏 순서 함수
LAG(column,n) | 지정한 행 이전의 행 가져온다. ex) LAG(salary, 2,0) 현재 행-2 번째 행의 값을 가져온다. 값 없으면 0 출력 |
LEAD(column,n) | 지정한 행 이후의 행 가져온다. ex) LEAD(hire_date,1,-1) 현재 행+1 번째 행 값을 가져온다. 값 없으면 -1 출력 |
select salary,
lag(salary,1,0) over (order by salary) as lower_sal,
lead(salary,1,0) over (order by salary) as higher_sal
from employees order by salary;
LISTAGG | 그룹 내의 내용을 한줄로 출력 |
ex) 부서별 사원의 이름을 출력하기
select department_id,
LISTAGG(first_name,',') within group(order by hire_date) as names
from employees
group by department_id;
<윈도우 절>
= 행과 행간의 관계 정의, 비교, 연산
윈도우절 구조
rows=물리적 결과 행 기준
range=논리적 범위 지정
BETWEEN A AND B = window의 끝과 시작 지정
UNBOUNDED PRECEDING = 첫번째 행에서 윈도우 시작
UNBOUNDED FOLLOWING = 윈도우 마지막 위치는 마지막 행
CURRENT ROW=현재행
윈도우 절 함수
순위 | rank, dense_rank, row_number |
집계 | sum, max,min,avg,count |
순서 | lag,lead, first_value, last_value |
그룹 내 비율 | cume_dist, percent_rank, ratio_to_report, ntile |
상관계수 = 두 변수가 얼마나 상관이 있는지 계산하는 수
윈도우절 예제
ex) 급여의 누적합 계산
hint- 부서아이디로 분할 후 급여를 오름차순 정렬하고 윈도우 영역을 각 분할의 첫 행부터 현재 행까지 설정
select department_id, first_name,salary,
sum(salary) over(partition by department_id order by salary
rows between unbounded preceding and current row) as sum_rows
<선형 회귀 함수>
=어떤 변수가 다른 변수에 어느정도의 영향을 주는지 계산하는 것
독립 변수=영향을 주는 변수 x (x가 여러개일 경우 X로 표시. column이 여러개인 것)
종속 변수=영향 받는 변수 y
결정계수=weight, bias가 얼마나 데이터를 잘 표현하지는 나타내는 수치 (R^2)
+) 둘 다 x,y가 null이 아니여야지 계산이 가능하다
REGR_AVGX(y,x) = x에 대한 평균 , null값은 무시
REGR_AVGY(y,x) = y에 대한 평균, null값은 무시
ex) 모든 사원의 급여 평균, 보너스 받는 사람의 급여 평균
select avg(salary), regr_avgx(commission_pct,salary)
from employees;
REGR_COUNT(y,x) = y,x둘 다 null이 아닌 경우 개수를 센다.
-- 회귀 모델에 사용할 수 있는지 확인 용도
select distinct department_id,
regr_count(manager_id, department_id) over (partition by department_id) "REGR_COUNT"
from employees;
REGR_SLOPE(y,x)
=weight 계산(회귀 직선 기울기)
COVAR_POP(y,x) / VAR_POP(x) == 공분산/분산
ex)세일즈 부서 사원들의 근물일에 따른 급여 직무별 기울기
REGR_INTERCEPT(y,x)
=bias 반환(회귀 직선 y절편)
AVG(y) - REGR_SLOPE(y,x)* AVG(x)
REGR_R2(y,x)
=회귀 분석 결정계수 반환
y=2.52*wd -1661.62
<피벗 테이블>
OLAP데이터, long format data
- 주로 DB로 저장하는 방식, 분석하기 편하다
OLTP 데이터, wide format data
-주로 엑셀에 저장하는 방식, 읽기 편하다
🍏PIVOT
=long format data를 wide format data로 변경. 엑셀에서 보기 좋은 테이블로 변경
PIVOT함수 구조
select ________
from tables,
PIVOT
(
aggregate_function(value column)
for variable colmn
in(___,___,____)
)
where ____
order by _____;
PIVOT 예제
select * from sales_log
pivot
(
sum(quantity)
for week_day in ('SALES_MON','SALES_TUE','SALES_WED','SALES_THU','SALES_FRI')
)
order by employee_id,week_id;
🍏UNPIVOT
=PIVOT의 반대
열이름의 값이 quantity
UNPIVOT 예제
select employee_id, week_id, week_day, quantity
from sales
unpivot( quantity for week_day
in(sales_mon, sales_tue, sales_wed, sales_thu, sales_fri));