윈도우 함수
순위, 집계 등 행과 행 사이의 관계를 정의하는 함수로 OVER 구문을 필수로 한다.
종류
- 순위 함수: RANK() / DENSE_RANK() / ROW_NUMBER()
- 집계 함수 : SUM() / MAX() / MIN() / AVG() / COUNT()
- 행 순서 함수 : FIRST_VALUE() / LAST_VALUE() / LAG() / LEAD()
- 비율 함수 : CUME_DIST() / PERCENT_RANK() / NTILE() / RATIO_TO_REPORT()
문법
SELECT WINDOW_FUNCTION(ARGUMENTS) OVER( [PARTITION BY 칼럼] [ORDER BY 절] [WINDOWING 절] )
FROM 테이블명;
1. 순위함수
- RANK() :
- 같은 값이 있다면 같은 순위로 표기, 모든 로우를 기준으로 해당 행의 순위 표기
- DENSE_RANK() :
- 순위를 기준으로 계산 중복 순위가 있다면 다음 순위는 해당 순위 +1 임
- ROW_NUMBER() :
- 같은 값이더라도 정렬된 순서대로 순위를 부
테이블 데이터
순위 함수 쿼리
SELECT
MEMBER_ID
,SQUAT
,BENCH_PRESS
,DEADLIFT
,(SQUAT+BENCH_PRESS+DEADLIFT) AS WEIGHT_SUM
,RANK() OVER (ORDER BY WEIGHT_SUM DESC)AS RANK //순위 함수
FROM GYM_MEMBER;
쿼리 결과
집계 함수는 사용에 익숙함으로 패스~
2. 행 순서 함수
- FIRST_VALUE() :
- 첫 값
- LAST_VALUE() :
- 마지막 값
- LAG() :
- 이전 값
- LEAD() :
- 다음값
현재 테이블 데이터
행 순서 함수 쿼리
SELECT
ID
, GROUP_NUM ,TIME_RECORD
, LAG(TIME_RECORD, 1) OVER(PARTITION BY GROUP_NUM ORDER BY TIME_RECORD ASC) AS LAG
, LEAD(TIME_RECORD, 1) OVER(PARTITION BY GROUP_NUM ORDER BY TIME_RECORD ASC) AS LEAD
, FIRST_VALUE(TIME_RECORD)
OVER(PARTITION BY GROUP_NUM ORDER BY TIME_RECORD ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS FIRST_VALUE
, LAST_VALUE(TIME_RECORD)
OVER(PARTITION BY GROUP_NUM ORDER BY TIME_RECORD ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_VALUE
FROM PARTICIPANT
ORDER BY GROUP_NUM ASC, TIME_RECORD ASC;
쿼리 결과
3. 비율 함수
쿼리 예시)
- 각 비용의 전체 비용 중 비율
SELECT
ID
, USE_CODE
, EXPENSE
, ROUND((EXPENSE / SUM(EXPENSE) OVER())*100 , 4)
FROM BUDGET_USE
ORDER BY ID ASC;
- 총점 기준으로 3분할
SELECT
ID
, MATH
, PHYSICS
, CHEMISTRY
, (MATH + PHYSICS + CHEMISTRY) AS SCORE_SUM
, NTILE(3) OVER(ORDER BY SCORE_SUM DESC) AS NTILE
FROM STUDENT
ORDER BY ID ASC;
'데이터 베이스' 카테고리의 다른 글
서브쿼리 와 View (1) | 2024.01.26 |
---|---|
계층형 질의 (0) | 2024.01.26 |
트랜잭션과 격리 수준 (0) | 2023.12.29 |
MySQL 명령어 및 쿼리 (익숙하지 않은 문법 기록용) (0) | 2023.12.12 |
데이터 베이스 정규화 (0) | 2023.12.12 |