5주차 목요일, 24일차 Today I Learned
SQL을 이용한 데이터 분석 (4)
: JOIN 소개
✏️ 학습 내용
1. JOIN
SQL에서 조인은 두 개 혹은 그 이상의 테이블들을 공통 필드를 가지고 머지하는데 사용된다. 이는 스타 스키마로 구성된 테이블들로 분산되어 있던 정보를 통합하는데 사용된다. 조인은 방식에 따라 어떤 레코드들이 선택되고, 어떤 필드들이 채워지는지 달라진다. 대부분의 조인은 INNER JOIN 이거나 LEFT JOIN 이다.
JOIN 시 고려할 점은 먼저 중복 레코드가 없고 Primary key의 uniqueness가 보장되는 지를 체크해야 한다는 것이다. 그리고 조인하는 테이블 간의 관계를 명확하게 정의해야 하며, 어느 테이블을 베이스로 잡을 지를 결정해야 한다.
만약 테이블들 간의 관계가 One to one 중 완전한 One to one이라면 어떠한 조인을 하던지 같은 결과가 되고, 그 이외에는 한쪽이 부분집합이 된다. One to many나 Many to one은 결과가 증폭하여 문제가 발생할 수 있으므로 데이터를 잘 파악하고 사용해야 한다. Many to many의 경우는 많지 않으며, 이를 one to one이나 one to many로 바꾸는 것이 가능하다면 변환하여 조인하는 것이 덜 위험하다.
JOIN에는 INNER, LEFT, RIGHT, FULL OUTER, SELF, CROSS 조인 등이 있다.
복잡한 JOIN을 해야 할 때는 먼저 JOIN 전략부터 수집해야 한다.
2. 숙제 풀이
-- 채널별 월 매출액 테이블 만들기
DROP TABLE IF EXISTS adhoc.name_monthly_channel_summary;
CREATE TABLE adhoc.name_monthly_channel_summary AS
SELECT
LEFT(ts, 7) "month",
channel,
COUNT(DISTINCT userid) AS uniqueUsers,
COUNT(DISTINCT CASE WHEN amount > 0 THEN usc.userid END) AS paidUsers,
ROUND(paidUsers*100.0/NULLIF(uniqueUsers, 0), 2) AS conversionRate,
SUM(amount) AS grossRevenue,
SUM(CASE WHEN refunded IS FALSE THEN amount END) AS netRevenue
FROM raw_data.user_session_channel AS usc
JOIN raw_data.session_timestamp AS t
ON t.sessionid = usc.sessionid
LEFT JOIN raw_data.session_transaction AS st
ON st.sessionid = usc.sessionid
GROUP BY 1, 2
ORDER BY 1, 2;
💡 배운 점
Join에 대해 중점적으로 배웠다.
☁️ 소감
이론은 간단하지만 실제 응용하는 것은 복잡하다. 갑자기 숙제가 확 어려워졌다. 그래도 다시 차근차근 풀어보아야 할 것 같다. 실제로는 이런 것들은 아무렇지 않게 해내야 할 테니까 말이다. 확실히 SQL 자격증과는 다른 느낌이다. 예전에 정리했던 SQL 자료를 다시 정리해야 할 것 같다!