TIL -DAY 34

김혁·2023년 11월 29일
0

Join 이란?

sql 조인은 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 머지하는데 사용된다. 이는 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용됨.

왼쪽 테이블을 LEFT라고 하고 오른쪽 테이블을 RIGHT이라고 하자. JOIN의 결과는 방식에 상관없이 양쪽의 필드를 모두 가진 새로운 테이블을 만들어내게 된다. 조인의 방식에 따라 다음 두가지가 달라진다.

  • 어떤 레코드들이 선택되는지?
  • 어떤 필드들이 채워지는지?

Join시 고려해야할 점

먼저 중복 레코드가 없고 primary key의 uniqueness가 보장됨을 체크

  • 아주 중요함!!!

조인하는 테이블들 간의 관계를 명확하게 정의

BOOLEAN 타입 처리

flag = True
flag is True
-> 두 표현 모두 동일한 표현

NULL 비교는 항상 IS 혹은 IS NOT

=, != 같은 경우 수행하면 잘못된 결과가 나온다.
만약 is not false 값으로 조회한다면, none도 세어짐-> 조심

COALESCE

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이 실행

profile
군도리

0개의 댓글