sql 조인은 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 머지하는데 사용된다. 이는 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용됨.
왼쪽 테이블을 LEFT라고 하고 오른쪽 테이블을 RIGHT이라고 하자. JOIN의 결과는 방식에 상관없이 양쪽의 필드를 모두 가진 새로운 테이블을 만들어내게 된다. 조인의 방식에 따라 다음 두가지가 달라진다.
먼저 중복 레코드가 없고 primary key의 uniqueness가 보장됨을 체크
조인하는 테이블들 간의 관계를 명확하게 정의
flag = True
flag is True
-> 두 표현 모두 동일한 표현
=, != 같은 경우 수행하면 잘못된 결과가 나온다.
만약 is not false 값으로 조회한다면, none도 세어짐-> 조심
null 값을 다른 값으로 바꿔주는 함수
즉 null 대신에 다른 백업 값을 리턴해주는 함수
select coalesce(value,0) -> value가 null 이면 0을 리턴
만들 때, 사용할 때 둘다 "" 로 싸줘야한다.
%%sql
--혹시 기존에 생성되어 있으면 삭제
DROP TABLE IF EXISTS adhoc.keeyong_monthly_channel_summary;
--Summary Table 생성
CREATE TABLE adhoc.keeyong_monthly_channel_summary
AS
SELECT TO_CHAR(ts, 'YYYY-MM') year_month,
usc.channel,
COUNT(DISTINCT usc.userid) unique_users,
COUNT(DISTINCT CASE WHEN amount>0 THEN userid END) paid_users,
ROUND(paid_users*100./NULLIF(unique_users,0),2) conversion_rate,
SUM(amount) gross_revenue,
SUM(CASE WHEN refunded is False THEN amount
ELSE 0 END) net_revenue
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
LEFT JOIN raw_data.session_transaction str ON usc.sessionid = str.sessionid
GROUP BY 1, 2;
--정상적으로 생성되었는지 확인
SELECT * FROM adhoc.keeyong_monthly_channel_summary;
여기서 join이 겹치는데 첫 번째 join결과를 토대로 두 번째 join이 실행