Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- CS
- CI/CD
- vm
- web server
- virtualization
- ORM
- spring batch
- computer science
- 영속성 컨텍스트
- mysql
- spring cloud
- 컨테이너
- Container
- spring boot
- Spring Security
- 배포
- 가상화
- HTTP
- 백엔드
- 데이터베이스
- 자바
- 스프링
- 스프링 부트
- 도커
- 스프링 시큐리티
- 스프링 배치
- Spring
- JPA
- 웹 서버
- Java
Archives
- Today
- Total
개발 일기
[Database] 윈도우 함수(Window Function) 본문
SQLD를 공부했었는데 그때 윈도우 함수에 대해 제대로 이해하지 못하고 통과 해버린 것 같았다.
SQL을 공부하면서 뭔가 그룹을 지어서 그 그룹에 대한 통계를 내는 용도로 쓰이는 걸 봤는데 GROUP BY랑 도대체 뭐가 잘 알지 못했다.
그래서 도대체 뭐가 다른지 그리고 어떻게 쓰이는지에 대해 간단히 정리해보게 됐다.
윈도우 함수(Window Function)
SQL의 윈도우 함수란 행과 행 간을 비교, 연산, 정의하기 위한 함수이다.
분석함수 또는 순위함수라고 하기도 한다.
다른 함수들처럼 중첩해서 사용할 수는 없지만 서브쿼리에서는 사용가능하다.
❓그래서 GROUP BY랑 뭐가 다른데?
가장 큰 차이는 아마 결과(출력) 방식. 즉, 데이터의 유지 방식인 것 같다.
조금 더 풀어서 설명해보자면
GROUP BY의 경우 동일한 값을 가진 행들을 그룹화하고, 그룹별로 집계 연산을 수행하며 집계 후에는 각 그룹당 하나의 결과 행만 남는다. (원래 행이 사라짐)
반면에 윈도우 함수의 경우 특정 윈도우(범위, 파티션) 내에서 계산(순위, 집계, 이동)을 수행하여 결과를 반환할때 원래 테이블의 각 행을 유지한 상태에서 추가적인 집계 결과를 생성한다.
윈도우 함수의 기본적인 구조
윈도우_함수() OVER (
PARTITION BY 그룹화할_컬럼
ORDER BY 정렬할_컬럼 [ASC | DESC]
[ROWS 또는 RANGE 옵션] -- (선택 사항)
)
🔹 각 요소 설명
- 윈도우_함수(): 실행할 윈도우 함수
- PARTITION BY: 그룹을 나누는 기준 (생략 가능)
- ORDER BY: 정렬 기준 (필수 아님, 함수에 따라 다름)
- ROWS 또는 RANGE: 윈도우 크기를 지정하는 옵션 (필수 아님)
MySQL에서 사용하는 몇몇 윈도우 함수를 정리해보자.
1️⃣ 순위 관련 윈도우 함수
RANK() | 동일한 값이면 같은 순위를 부여하지만, 다음 순위는 건너뜀 (1, 2, 2, 4) |
DENSE_RANK() | 동일한 값이면 같은 순위를 부여하고, 다음 순위는 연속 (1, 2, 2, 3) |
ROW_NUMBER() | 동일한 값이어도 개별적인 순위를 부여 (중복 없음, 1, 2, 3, 4) |
NTILE(n) | 데이터를 n개의 그룹으로 나눔 |
2️⃣ 집계(Aggregation) 윈도우 함수
SUM() | 그룹 내에서 합계를 계산 |
AVG() | 그룹 내에서 평균을 계산 |
MIN() | 그룹 내에서 최소값을 반환 |
MAX() | 그룹 내에서 최대값을 반환 |
COUNT() | 그룹 내 행 개수를 반환 |
3️⃣ 이동(Moving) 윈도우 함수
LAG(column, offset, default) | 이전 행 값을 가져옴 (column의 값을 offset만큼 앞에서 들고오고 없으면 default 인자로 채워넣음) |
LEAD(column, offset, default) | 다음 행 값을 가져옴 (column의 값을 offset만큼 뒤에서 들고오고 없으면 default 인자로 채워넣음) |
FIRST_VALUE(column) | 그룹 내 첫 번째 값을 반환 |
LAST_VALUE(column) | 그룹 내 마지막 값을 반환 |
NTH_VALUE(column, n) | 그룹 내 n번째 값을 반환 |
rows와 range 차이
rows는 행(row) 개수 기준으로 범위 지정하고 range는 값(value, ORDER BY 기준 컬럼)을 기준으로 범위 지정
✅ ROWS / RANGE에서 사용하는 키워드 정리
UNBOUNDED PRECEDING | 현재 행부터 처음(최상단 행)까지 포함 |
UNBOUNDED FOLLOWING | 현재 행부터 마지막 행까지 포함 |
CURRENT ROW | 현재 행 포함 |
N PRECEDING | 현재 행을 기준으로 N개의 이전 행 포함 |
N FOLLOWING | 현재 행을 기준으로 N개의 이후 행 포함 |
'Computer Science > Database' 카테고리의 다른 글
[Database] MySQL Index 적용해보기 (0) | 2025.03.25 |
---|---|
[MongoDB] 채팅 데이터 저장을 위한 Mongo DB (0) | 2024.10.01 |
[Redis] Redis(Remote Dictionary Server) 이해하고 사용하기 (4) | 2024.09.22 |
[H2] H2 데이터베이스 (1) | 2024.09.21 |
[MySQL] GROUP BY 와 ONLY_FULL_GROUP_BY (1) | 2024.08.28 |