❓윈도우함수(Window Function)
윈도우함수(Window Function)란 행과 행 간의 관계를 정의하기 위해 제공되는 함수입니다. 여기에서의 관계를 정의한다는 것은 비교, 연산, 행 위치 조작을 말한다.
❓윈도우함수(Window Function)함수의 구조
SELECT WINDOW_FUNCTION(ARGUMENTS) OVER (PARTITION BY column ORDER BY WINDOWING 절)
FROM 테이블명;
-- ARGUMENTS : Window Function에 따라 N개의 인수
-- PARTION BY : 소그룹으로 분류
-- ORDER BY : 분류된 소그룹 정렬
-- WINDOWING : 행 기준 설정
❓windowing절의 구조
문법 | 설명 |
ROWS | 물리적인 행 |
RANGE | 논리적인 행 |
UNBOUNDED PRECEDING | 첫 번째 행 |
UNBOUNDED FOLLOWING | 마지막 행 |
CURRENT ROW | 현재 행 |
PRECEDING | 이전 행(위치) |
FOLLOWING | 다음 행(위치) |
❓윈도우함수(Window Function)의 종류
분류 | 예시 |
그룹내 순위 함수 | RANK, DENSE_RANK, ROW_NUMBER |
그룹내 집계 함수 | SUM, MAX, MIN, COUNT, AVG |
그룹내 순위 함수(RANK, DENSE_RANK, ROW_NUMBER)
이 각각의 함수는 순위를 매긴다는 공통점은 있지만 결과값은 다릅니다. 예제를 보며 확인해보도록 하겠습니다.
학생 | 점수 |
김OO | 46 |
모OO | 46 |
문OO | 95 |
박OO | 86 |
변OO | 86 |
차OO | 80 |
최OO | 76 |
위와 같은 학생 테이블에서 순위 함수를 사용하여 등수를 매기도록 하겠습니다.
SELECT name
, score
, RANK() OVER (ORDER BY score DESC) AS rnk
, DENSE_RANK() OVER (ORDER BY score DESC) as drnk
, ROW_NUMBER() OVER (ORDER BY score DESC) as rownum
FROM record;
그룹내 순위 함수별 적용 결과
학생 | 점수 | rnk | drnk | rownum |
문OO | 95 | 1 | 1 | 1 |
박OO | 86 | 2 | 2 | 2 |
변OO | 86 | 2 | 2 | 3 |
차OO | 80 | 4 | 3 | 4 |
최OO | 76 | 5 | 4 | 5 |
김OO | 46 | 6 | 5 | 6 |
모OO | 46 | 6 | 5 | 7 |
위의 조회 결과를 보면 세 개의 함수의 결과가 모두 다른 것을 알 수 있습니다.
- RANK() : 점수가 같은 학생들을 동일한 순위로 매기고 동점의 학생 수만큼 다음 순위를 뒤로 밀어냄
- DENSE_RANK() : 점수가 같은 학생들을 동일한 순위로 매기고 다음 순위를 밀어내지 않음
- ROWNUM() : 점수가 같은 학생들을 동일한 순위로 매기지 않음
그룹내 집계 함수
2022.12.25 - [MYSQL] - [MYSQL]GROUP BY(그룹화)
이전에 GROUP BY에서 다루었던 내용을 보면 특정 그룹에 따른 집계 값을 구할 수 있었습니다. 즉 여러 개의 행들을 합친 후 1개의 값을 반환 하였습니다. 하지만 윈도우 집계 함수는 각 행마다 1개의 값을 반환합니다. 예제를 확인하도록 하겠습니다.
place | date | record |
안산 시험장 | 2022-12-25 | 86 |
수원 시험장 | 2022-12-27 | 88 |
안산 시험장 | 2022-12-27 | 88 |
수원 시험장 | 2022-12-29 | 92 |
부천 시험장 | 2022-12-31 | 92 |
부천 시험장 | 2022-12-31 | 94 |
인천 시험장 | 2022-12-31 | 92 |
위 테이블에서 장소와, 날짜가 동일 한 컬럼의 대한 윈도우 집계 함수를 사용하여 조회해보도록 하겠습니다.
select date
, place
, record
, AVG(record) OVER(PARTITION BY date, place) AS avg_record
FROM dailyrecord;
그룹별 집계 함수별 적용 결과
place | date | record | avg_record |
안산 시험장 | 2022-12-25 | 86 | 86 |
수원 시험장 | 2022-12-27 | 88 | 88 |
안산 시험장 | 2022-12-27 | 88 | 88 |
수원 시험장 | 2022-12-29 | 92 | 92 |
부천 시험장 | 2022-12-31 | 92 | 93 |
부천 시험장 | 2022-12-31 | 94 | 93 |
인천 시허장 | 2022-12-31 | 92 | 92 |
'RDBS > MYSQL' 카테고리의 다른 글
[MYSQL]INSERT - 여러 건 삽입 (12) | 2023.01.09 |
---|---|
[프로그래머스]입양 시각 구하기(1)-MySQL (9) | 2023.01.07 |
[MYSQL]USING과 ON의 차이 (6) | 2023.01.05 |
[MYSQL]INDEX란? (2) | 2023.01.02 |
[MYSQL]ROWNUM 이용한 데이터 번호 매기기 (1) | 2022.12.14 |