SQL ํ์ต - GROUP BY, CTAS (TIL 230510)
๐ KDT WEEK 6 DAY 3 TIL
- GROUP BY
- CTAS
๐ฅ GROUP BY & Aggregate
ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ๊ทธ๋ฃนํ(GROUP BY)ํ์ฌ ๊ทธ๋ฃน๋ณ๋ก ๋ค์ํ ์ ๋ณด๋ฅผ ๊ณ์ฐ(Aggregate)ํ๋ค
- ๊ทธ๋ฃนํํ ํ๋ ์ด์์ ํ๋๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๊ทธ๋ฃน๋ณ๋ก ๊ณ์ฐํ ๋ด์ฉ์ ๊ฒฐ์ ํ๊ณ ํจ์๋ฅผ ์ฌ์ฉ
- COUNT, SUM, AVG, MIN, MAX, LISTAGG...
์์ 1)
SELECT LEFT(ts,7) AS mon, COUNT(1) AS session_count
FROM raw_data.session_timestamp
GROUP BY 1 -- GROUP BY mon, GROUP BY LEFT(ts,7)
ORDER BY 1;
raw_data.session_timestamp ํ ์ด๋ธ์์ ์๋ณ ์ด ์ธ์ ์๋ฅผ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ์ด๋ค.
GROUP BY 1 ์ ์ฌ์ฉํ๋ฉด, 1์ ํด๋นํ๋ mon์ด ๊ทธ๋ฃนํ๋๋ค.
๋ฐ๋ผ์ ๊ทธ๋ฃนํ๋ mon๋ณ๋ก COUNT(1)์ ํตํด ์ด ์ธ์ ์ ์๋ฅผ ๊ตฌํ ์ ์๊ฒ๋๋ค.
์์ 2)
SELECT
channel,
COUNT(1) AS session_count,
COUNT(DISTNICT userId) AS user_count
FROM raw_data.user_session_channel
GROUP BY 1 --GROUP BY channel
ORDER BY 2 DESC; -- ORDER BY session_count DESC
raw_data.user_session_channel ํ ์ด๋ธ์์ ์ฑ๋๋ณ ์ธ์ ์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ์ด๋ค.
์์ 3)
SELECT
TO_CHAR(A.ts, 'YYYY-MM') AS month,
COUNT(DINTINCT B.userid) AS mau,
FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid
GROUP BY 1
ORDER BY 1 DESC;
๋ ํ ์ด๋ธ์ ์กฐ์ธ(INNER JOIN)ํ์ฌ ์๋ณ ์ ๋ํฌํ ์ฌ์ฉ์ ์๋ฅผ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ์ด๋ค.
- TO_CHAR์ ๊ฒฝ์ฐ non charํ์ ์ ๋ฐ์ดํฐ๋ฅผ ํด๋น ํํ(YYYY-MM)์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ ์ ํ๋ค.
- LEFT(A.ts, 7) ๊ณผ SUBSTRING(A.ts, 1, 7)์ ๋ฐ์ ์ธ์๊ฐ์ ๋ฐ๋ผ ๋ฌธ์์ด๋ก ์๋ผ์ฃผ๋ ์ญํ ๋ก์จ ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- timestamp ํ์ ์ ์ ์งํ๋ค๋ฉด DATE_TRUNC('month', A.ts)์ ์ฌ์ฉํ๋ค.
๐ฆ CTAS
์์ฑ๊ณผ ๋์์ AS SELECT ๋ฌธ์ ๋ถ์ฌ์ ๋ฐ์ดํฐ๊น์ง ๋์์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ
์์ฃผ JOINํ๋ ํ ์ด๋ธ์ด ์๋ค๋ฉด ์ ์ฉํ๋ค.
CREATE TABLE ํ ์ด๋ธ์ด๋ฆ AS SELECT ~
ex)
DROP TABLE IF EXISTS adhoc.test_session_summary; -- ์ด๋ฏธ ์กด์ฌํ๋ ๊ฑด ์ญ์
CREATE TABLE adhoc.test_session_summary AS
SELECT B.* , A.ts
FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid;
์์๋ก ์ฌ์ฉํ ํ ์ด๋ธ์ด๋ฏ๋ก raw_data ํด๋๊ฐ ์๋ adhoc ํด๋์ ์์ฑํ๋๋ก ํ๋ค.
AS SELECT ๊ตฌ๋ฌธ ๋ฐ์ผ๋ก ๋์ค๋ ํ ์ด๋ธ์ test_session_summary ์ด๋ฆ์ผ๋ก ์๋ก์ด ํ ์ด๋ธ ์์ฑํ ์ ์๋ค.
์์