데이터리안 '[백문이 불여일타] 데이터 분석을 위한 고급 SQL' 을 수강하며 정리한 내용입니다.
Winodw Function
함수(<column>) OVER (PARTITION BY <column> ORDER BY <column>)
ex. SUM(profit) OVER (PARTITION BY country)
- 함수(함수를 적용하고 싶은 column)
- ex. SUM, AVG, COUNT
- PARTITION BY 그룹화 기준으로 삼고싶은 column (그룹을 지정해주는 것)
- ORDER BY 정렬 기준으로 삼고싶은 column
Window Function vs GROUP BY
GROUP BY : 1 그룹당 1개 값으로 요약
Window Function : 그룹별 1개 row로의 요약 대신 각 row(원래 데이터)에 그룹별 요약 결과물을 뿌려주는 느낌
집계함수
MAX()
-- 각 부서별 가장 많이 버는 사람 찾기
SELECT Id,
MAX(Salary) OVER (PARTITION BY DepartmentId) AS MaxSalary
FROM Employee
SUM()
- SUM(<column1>) OVER (ORDER BY <column2>)
- column1의 값을 column2의 순서대로 누적해서 더해주는 연산을 수행 (누적합)
-- 누적합
SELECT Id,
kg,
SUM(kg) OVER (ORDER BY Line) AS CumSum -- Line 순서대로 kg 값을 더해줌
FROM Elevator
- SUM(<column1>) OVER (ORDER BY <column2> PARTITION BY <column3>)
- column1의 값을 column2의 순서대로 누적해서 더해주되 이 연산을 column3 그룹별로 수행
순위정하기
ROW_NUMBER(), RANK(), DENSE_RANK()
- window function에서만 지원
- 순위정하기 함수는 괄호 안에 인자가 들어가지 않음
- 순위를 정해야 하는 기준 column만 ORDER BY를 통해 알고있으면 되기 때문
SELECT Id,
ROW_NUMBER() OVER (ORDER BY score),
RANK() OVER (ORDER BY Score),
DENSE_RANK() OVER (ORDER BY Score)
FROM Sample
- ROW_NUMBER() 는 중복 순위 없음
- RANK()는 값이 똑같으면 동일한 순위 부여, 1등이 2명 있을 때 다음 순위는 3등부터 시작
- DENSE_RANK() 값이 똑같으면 동일한 순위 부여, 1등이 2명 있을 때 다음 순위는 2등부터 시작
데이터 위치 바꾸기
- LAG(<column>, 칸수, Default), LEAD(<column>, 칸수, Default)
- LAG()는 데이터를 밀고
- LEAD()는 데이터를 당김
SELECT Id,
Score,
LAG(Score) OVER (ORDER BY Id) AS 'Lag', -- 1칸씩 뒤로 밀림, 데이터가 없으면 NULL
LEAD(Score, 2, 0) OVER (ORDER BY Id) AS 'Lag' -- 2칸씩 앞으로 당김, 데이터가 없으면 0으로 채움
FROM Sample
'SQL' 카테고리의 다른 글
[LeetCode] Delete Duplicated Emails 📌 (0) | 2024.02.16 |
---|---|
[문법] IF / CASE WHEN (0) | 2023.12.28 |
[문법] LIKE (0) | 2023.12.28 |
leetcode_reformat department table (0) | 2023.01.13 |
HackerRank_SQL_Type of Triangle <못품> (0) | 2023.01.11 |