SQL

Window Function

응엉잉 2024. 5. 8. 11:46

데이터리안 '[백문이 불여일타] 데이터 분석을 위한 고급 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