GROUP BY vs PARTITION BY
WINDOW FUNCTION은 GROUP BY와 비슷하게 데이터를 그룹화하여 집계해준다.
GROUP BY
- 집계된 결과만 보여준다.
윈도우 함수
- 기존 데이터 + 집계된 값
해당 데이터를 가진 테이블이 있을 때,
GROUP BY를 사용한 경우
select employee_id, sum(price)
from sellings
group by employee_id;
윈도우 함수를 사용한 경우
select car_id, employee_id, sum(price) over (partition by employee_id)
from sellings
order by car_id;
기본 형태
함수(함수_적용_열) OVER (PARTITION BY 그룹열 ORDER BY 순서열)
PARTITION BY : GROUP BY 와 동일한 기능
GROUP BY와 PARTITION BY의 적용
1. 집계 함수
SUM() : 합 / MIN() : 최소값 / MAX() : 최대값 / AVG() : 평균 / COUNT() : 갯수
MAX(열) OVER (PARTITION BY 그룹열) -- 예시) 최대값
SUM(열) OVER (ORDER BY 순서열) -- 누적합
SUM(열) OVER (ORDER BY 순서열 PARTITION BY 그룹열) -- 그룹끼리 누적합
→ PARTITION BY에 그룹할 기준을 지정한다.
→ ORDER BY에 정렬 기준을 지정한다.
2. 순위
1) ROW_NUMBER() : 중복 없는 순위. 행 번호
2) RANK() : 중복 가능. 공동순위만큼 건너뛴다.
3) DENSE_RANK()
- 중복가능
- 공동순위가 있더라도 1, 2, 3 순차적으로 순위가 매겨진다.
- 동일한 순위는 하나의 순위로 취급
SELECT val
-- 행 번호
, ROW_NUMBER() OVER (ORDER BY val) AS 'row_number'
-- 순위
, RANK() OVER (ORDER BY val) AS 'rank'
-- 순위 : 순차적
, DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank'
FROM table
→ ORDER BY에 순위의 기준을 지정한다.
→ 인자가 들어가지 않는다.
3. 데이터 위치 바꾸기
1) LAG(열, n, 결측값 채울 값) : n칸 미루기
- LAG(열, n) OVER (PARTITION BY 그룹열 ORDER BY 순서열)
2) LEAD(열, n, 결측값 채울 값) : n칸 당기기
- LEAD(열, n) OVER (PARTITION BY 그룹열 ORDER BY 순서열)
SELECT Id
, RecordDate -- ORDER 열
, Temperature -- 대상 열
-- 미루기
, LAG(Temperature) OVER (ORDER BY RecordDate) AS 'lag'
-- 당기기
, LEAD(Temperature) OVER (ORDER BY RecordDate) AS 'lead'
FROM table
→ PARTITION BY에 그룹할 기준을 지정한다.
→ ORDER BY에 정렬 기준을 지정한다.
참고 블로그
https://mizykk.tistory.com/121
'코딩 > MySQL' 카테고리의 다른 글
[MySQL] 코딩테스트 대비 문법 정리 (1) | 2023.10.05 |
---|---|
[SQL] 조건문 (1) | 2023.10.02 |
[SQL] JOIN 연산 (1) | 2023.10.02 |
[SQL] 데이터 조회하기 (0) | 2023.09.29 |