두 개 혹은 그 이상의 테이블들을 특정 키를 기준으로 합친다.
조인의 방식에 따라 다음 두 가지가 달라진다:
특정 필드 기준으로 왼쪽 테이블과 오른쪽 테이블 모두 존재하는 레코드들만 반환한다.
왼쪽테이블 전체와, 왼쪽 테이블에 있는 필드와 연관된 오른쪽 테이블의 필드를 선택한다.
LEFT (OUTER) JOIN과 같은데 방향만 다르다.
양 쪽 레코드 전체
한 쪽 테이블에만 존재하는 레코드는, 다른 쪽 테이블의 필드를 NULL로 반환한다.
양 테이블의 모든 레코드들의 조합
동일한 테이블 두 개로 조인한다.
CROSS JOIN과 같으나 조인 조건이 없는 경우
SELCT A.*, B.*
FROM A
___ JOIN B on A.key1 = B.key1 and A.key2 = B.key2
WHERE ... ;
CREATE TABLE t AS
SELECT
TO_CHAR(B.ts, 'YYYY-MM') AS month,
A.channel AS channel,
COUNT(DISTINCT A.userId) AS uniqueUsers,
COUNT(DISTINCT CASE WHEN C.sessionId IS NOT NULL THEN A.userId END) AS paidUsers,
(COUNT(DISTINCT A.userId)::FLOAT/COUNT(DISTINCT CASE WHEN C.sessionId IS NOT NULL THEN A.userId END)) AS conversionRate,
SUM(amount) AS grossRevenue,
SUM(CASE WHEN refunded is TRUE THEN amount ELSE 0 END) AS netREVENUE
FROM user_session_channel A
JOIN session_timestamp B
ON A.sessionId = B.sessionId
LEFT OUTER JOIN session_transaction C
ON B.sessionId = C.sessionId
GROUP BY TO_CHAR(B.ts, 'YYYY-MM'), A.channel
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;
“”로 감싸서 사용한다.
DROP TABLE IF EXISTS adhoc.keeyong_test;
CREATE TABLE adhoc.keeyong_test (
group int primary key,
'mailing address' varchar(32)
);
위의 코드를 아래처럼 써야한다.
CREATE TABLE adhoc.keeyong_test (
"group" int primary key,
"mailing address" varchar(32)
);