RDBS/MYSQL

[MYSQL]윈도우함수(Window Function)

MoonSta 2023. 1. 3. 15:41

❓윈도우함수(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(그룹화)

 

[MYSQL]GROUP BY(그룹화)

⭐GROUP BY란? SQL에 대해 학습하면서 꼭 알아야 할 구문 중 하나인 GROUP BY에 대해 알아보도록 하겠습니다. 실제 데이터를 조회하면서 데이터를 집계해야 할 상황이 생깁니다. 이러한 상황에서 GROUP

mooonstar.tistory.com

 이전에 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