집순이 놀이터

[Partition By] 본문

Study/SQL

[Partition By]

방구석집순이 2022. 6. 21. 04:37

메가콘2022를 듣고 주니어 데이터 분석가로서 공부해야 하는 것들을 하나하나 채우려 한다.
그 중 SQL 신이 되기 위한 이론공부를 시작해 보도록하자
집계 데이터를 하나의 컬럼데이터로 만들때 사용하는 Partition By 문
  

GROUO BY와의 차이점

일단 어떤 결과물을 내는 구문인지 눈으로 보기 위해 GROUP BY와 차이점 짚고 가자


# GROUP BY : 집계 기준, 집계 함수에 대한 컬럼만 존재 
# 집계 데이터 name에 중복된 값이 없다. 
SELECT name ,AVG(price)
FROM CART_PRODUCTS 
GROUP BY name 

# PARTITION BY : 각각의 raw데이터를 보존하면서, 집계에 대한 컬럼을 추가하는 방법
# 집계의 기준이 되는 name에 중복를 허용한다. 
SELECT name , AVG(price) OVER (PARTITION BY name)
FROM CART_PRODUCTS

#표현식 

분석함수([칼럼]) OVER(PARTITION BY 칼럼1, 칼럼2... [ORDER BY 절] [WINDOWING 절])


Parition by 구문은 '집계'함수 모두 사용할 수 있습니다.

구분 분석함수
집계 COUNT, MAX, MIN, SUM, AVG
순위 ROW_NUMBER, RANK, DENSE_RANK
순서 FIRST_VALUE, LAST_VALUE, LAG, LEAD
통계 STDDEV, VARIANCE
비율 RATIO_TO_REPORT, CUME_DIST, PERCENT_RANK, NTITLE

출처 : https://gent.tistory.com/442

 

[Oracle] 오라클 PARTITION BY 사용법 정리 (분석함수)

오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION B

gent.tistory.com

https://programmers.co.kr/learn/courses/30/lessons/6228 

 

 

예시 1 )

 https://app.mode.com/benn/reports/c1039e799f77/runs/21a44c0d302d/embed

 

https://app.mode.com/benn/reports/c1039e799f77/runs/21a44c0d302d/embed

Report not found There was a problem finding this report.

app.mode.com

상황 : 세션을 구하기 위한 이벤트 시간 차이 구할 때 

LAG : 이전 행의 값을 리턴

LEAD : 이후 행의 값을 리턴 

LAG (expr [,offset] [,default])  OVER([partition_by_clause] order_by_clause)
LEAD(expr [,offset] [,default]) OVER([partition_by_clause] order_by_clause)
SELECT user_id,
	event_type,
        event_name,
        occurred_at,
        LAG(occurred_at,1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS lag_event,
        LEAD(occurred_at,1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS lead_event, 
        occurred_at - LAG(occurred_at,1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event,
        LEAD(occurred_at,1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event,
        ROW_NUMBER() OVER () AS id
FROM tutorial.yammer_events e
WHERE e.event_type = 'engagement'
ORDER BY user_id,occurred_at

 

결과 화면 

lag_event : 이전 이벤트 발생 시간

lead_event : 다음 이벤트 발생 시간

last_event : 이벤트 발생시간 - 이번 이벤트 발생 시간 => 전 이벤트와이 시간 차이 

next_evnet : 다음 이벤트 발생 시간 - 이벤트 발생시간 => 다음 이벤트와의 시간 차이