728x90
Window함수란? : 각 행의 관계를 정의하기 위한 함구로 그룹 내의 연산을 쉽게 만들어 준다.
예시)
- 한식 식당 중에서 주문건수가 많은 순으로 순위를 매기고 싶을 때
- 한식 식당 전체 주문건수 중에서 A식당이 차지하는 비율을 알고 싶을 때
- 2건 이상 주문을 한 소비자 중에, 처음 주문한 식당과 2번째로 주문한 식당을 같이 조회하고 싶을 때
→ 기본 SQL 구조로 해결할 수도 있지만 여러 Subquery문을 이용해야 한다.
Window Function의 기본 구조
window_function(argument) over (partition by 그룹 기준 컬럼 order by 정렬 기준)
- window_function : 기능 명을 사용해줍니다. (sum, avg 와 같이 기능명이 있습니다)
- argument : 함수에 따라 작성하거나 생략합니다.
- partition by : 그룹을 나누기 위한 기준입니다. group by 절과 유사하다고 생각해주시면 됩니다.
- order by : window function 을 적용할 때 정렬 할 컬럼 기준을 적어줍니다.
[실습1] N 번째까지의 대상을 조회하고 싶을 때, Rank
음식 타입별, 음식점별 주문 건수 집계하고, 3위까지 조회, 음식 타입별, 순위별로 정렬하기
SELECT cuisine_type,
restaurant_name,
cnt_order,
ranking
FROM
(
SELECT cuisine_type,
restaurant_name,
cnt_order,
RANK()OVER(partition by cuisine_type order by cnt_order desc) ranking -- 음식타입별 랭킹을 오름차순으로
FROM
(
SELECT cuisine_type,
restaurant_name,
COUNT(1) cnt_order
FROM food_orders
GROUP BY 1,2
)a
)b
WHERE ranking <= 3
[실습2] 전체에서 차지하는 비율, 누적합을 구할 때, Sum
음식 타입별, 음식점별 주문 건수 집계하고, 카테고리별 합, 카테고리별 누적합 구하기
SELECT cuisine_type,
restaurant_name,
cnt_order,
SUM(cnt_order) OVER(partition by cuisine_type) sum_cuisine,-- 음식 타입별 합계
SUM(cnt_order) OVER(partition by cuisine_type order by cnt_order) cum_cuisine -- 누적합
FROM
(
SELECT cuisine_type,
restaurant_name,
COUNT(1) cnt_order
FROM food_orders
GROUP BY 1,2
)a
ORDER BY cuisine_type, cnt_order
728x90
'내일배움캠프 > SQL' 카테고리의 다른 글
[SQL]WHERE절의 부정연산자_ !=, <>, NOT,NULL값이 아닐 때 (0) | 2024.11.27 |
---|---|
[SQL]날짜 포맷과 조건 (포맷 함수) (2) | 2024.11.18 |
[SQL]피벗테이블 만들기 (0) | 2024.11.18 |
[SQL]데이터에서 예상하지 못한 값이 나왔을 때 (이상한 값, 값이 없음 등) (0) | 2024.11.18 |
[SQL] 다른 테이블 합치기 JOIN (1) | 2024.11.15 |