Window Function?
● 각 행의 관계를 정의하기 위한 함수
→ 그룹 내의 연산을 쉽게 만들어줌
● 언제 사용할까?
- 한 지역 식당 중 음식 종류에 따라 순위를 매기고 싶을 때
- 음식 종류에 따른 전체 주문건수 중 A 식당이 차지하는 비율 등...
● 기본 SQL 구조로 해결하려면 복잡하게 SubQuery 문을 사용하거나
여러 번의 연산을 수행해줘야 하지만, Window Function을 이용하면 조금 더 편리하게 표현 가능
● 기본 구조
WINDOW_FUNCTION(argument) over (partition by 그룹 기준 칼럼 order by 정렬 기준) |
- WINDOW_FUNCTION : 기능 명을 사용 (=SUM, AVG)
- argument : 함수에 따라 작성 or 생략
- partition by : 그룹을 나누기 위한 기준 (=GROUP BY와 유사)
- order by : Window Function 을 적용할 때 정렬할 칼럼 기준
● 어떻게 사용할까?
- N 번째까지의 대상을 조회하고 싶을 때 - RANK
- RANK : 특정 기준으로 순위를 매겨주는 기능
- RANK를 사용해서 주문 건수별 순위 매기기, 결제 시간이 빠른 순서로 순위 매기기 등이 가능
예시 문제 : 음식 종류별로 주문 건수가 가장 많은 음식점 3개씩 조회하기
1. 음식 종류별, 음식점별 주문 건수 집계
SELECT 음식종류, 음식점명, COUNT(1) 주문건수 FROM 주문정보 GROUP BY 1, 2 |
- SubQuery에서 사용할 테이블은 '주문정보'
- '음식 종류별', '가장 많은 음식점', '주문 건수' 키워드에 맞게 음식종류, 음식점명, 주문건수 칼럼 조회
- 음식종류와 음식점며을 기준으로 그룹화
2. RANK 함수 적용
SELECT 음식종류, 음식점명, RANK() over (partition by 음식종류 order by 주문건수 DESC) rank |
- Window Function 중 하나인 RANK의 사용
- 음식종류를 RANK 함수에 따라 주문건수 수만큼 오름차순 정리
3. 전체 구문
SELECT 음식종류, 음식점명, 주문건수, rank "순위" FROM ( SELECT 음식종류, 음식점명, RANK() over (partition by 음식종류 order by 주문건수 DESC) rank FROM ( SELECT 음식종류, 음식점명, COUNT(1) 주문건수 FROM 주문정보 GROUP BY 1, 2 ) a ) b WHERE rank <= 3 ORDER BY 1, 4 |
- 최종적으로 나와야 하는 값들은 '순위' 칼럼 안에 3등 이내의 음식점들
- 'COUNT(1) 주문건수'에 따라 음식점별로 도출된 주문건수로 순위 결정
- 음식종류별로 1~3등까지 등수가 매겨지면 완성
'Programming Language' 카테고리의 다른 글
[SQL] 4-1. SQL과 제약 조건 (0) | 2024.11.25 |
---|---|
[SQL] 3. DDL, DML, DCL, TCL (0) | 2024.11.22 |
1-3 데이터베이스, SQL 기초 (2) | 2024.10.11 |
1-2. 데이터베이스, SQL 기초 (3) | 2024.10.10 |
1-1. 데이터베이스, SQL 기초 (4) | 2024.10.08 |