π κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ μμ - μΉμλΉμ€ μ¬μ©μ/μΈμ
μ 보
- μ¬μ©μ ID : λ³΄ν΅ μΉμλΉμ€μμλ λ±λ‘λ μ¬μ©μλ§λ€ λΆμ¬νλ μ μΌν ID
- μΈμ
ID : μΈμ
λ§λ€ λΆμ¬λλ ID
- μΈμ
: μ¬μ©μμ λ°©λ¬Έμ λ
Όλ¦¬μ μΈ λ¨μλ‘ λλ κ²
- μ¬μ©μκ° μΈλΆ λ§ν¬(κ΄κ³ )λ₯Ό νκ³ μ€κ±°λ μ§μ λ°©λ¬Έν΄μ μ¬ κ²½μ° μΈμ
μ μμ±
- μ¬μ©μκ° λ°©λ¬Έ ν 30λΆκ° Interactionμ΄ μλ€κ° λκ°λ₯Ό νλ κ²½μ° μλ‘ μΈμ
μ μμ±
- νλμ μ¬μ©μλ μ¬λ¬ κ°μ μΈμ
μ κ°μ§ μ μλ€.
- λ³΄ν΅ μΈμ
μ κ²½μ° μΈμ
μ λ§λ€μ΄λΈ μ μ (κ²½μ°μ§)λ₯Ό μ±λμ΄λ μ΄λ¦μΌλ‘ κΈ°λ‘ν΄λλ€.
-> λ§μΌν
κ΄λ ¨ κΈ°μ¬λ λΆμμ μνκ²μ΄λ€.
- μΈμ
μ΄ μκΈ΄ μκ°λ κΈ°λ‘νλ€.
- μ΄ μ 보λ₯Ό κΈ°λ°μΌλ‘ λ€μν λ°μ΄ν° λΆμκ³Ό μ§ν μ€μ μ΄ κ°λ₯νλ€.
- λ§μΌν
κ΄λ ¨, μ¬μ©μ νΈλν½ κ΄λ ¨
- DAU, WAU, MAUλ±μ μΌμ£Όμλ³ Active User μ°¨νΈ
- Marketing Channel Attribution λΆμ
- μ΄λ μ±λμ κ΄κ³ λ₯Ό νλ κ²μ΄ κ°μ₯ ν¨κ³Όμ μΈκ°?
- μ¬μ©μ ID 100λ² : μ΄ 3κ°μ μΈμ
(νλ κΈμ¨)μ κ°λ μμ
- μΈμ
1 : κ΅¬κΈ ν€μλ κ΄κ³ λ‘ μμν μΈμ
- μΈμ
2 : Facebook κ΄κ³ λ₯Ό ν΅ν΄ μκΈ΄ μΈμ
- μΈμ
3 : λ€μ΄λ² κ΄κ³ λ₯Ό ν΅ν΄ μκΈ΄ μΈμ
κ΅¬κΈ κ΄κ³ (λ°©λ¬Έ) -> μν κ΄κ³ ν΄λ¦ -> μν 리뷰 νμ΄μ§ ν΄λ¦ -> Facebook κ΄κ³ (λ°©λ¬Έ)
-> λ€λ₯Έ μν κ΄κ³ ν΄λ¦ -> λ€μ΄λ² κ΄κ³ (λ°©λ¬Έ) -> μν ꡬ맀
π κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ μμ - λ°μ΄ν°λ² μ΄μ€μ ν
μ΄λΈ
raw_data DB(μ€ν€λ§)
user_session_channel Table
| μ»¬λΌ | νμ
|
|---|
| userid | int |
| sessionid | varchar(32) |
| channel | varchar(32) |
session_timestamp Table
| μ»¬λΌ | νμ
|
|---|
| sessionid | varchar(32) |
| ts | timestamp |
π SQL κΈ°λ³Έ
- λ¨Όμ λ€μμ SQLλ¬Έμ μ€ννλ€λ©΄ μΈλ―Έμ½λ‘ (;)μΌλ‘ λΆλ¦¬κ° νμνλ€.
- SQL μ£Όμ -> --(νμ€), /--/(μ¬λ¬μ€)
- SQLν€μλλ λλ¬Έμλ₯Ό μ¬μ©νμ¬ λλ¦λλ‘ ν¬λ§·ν
μ΄ νμνλ€.
-> ν νλ‘μ νΈλΌλ©΄ νμμ μ¬μ©νλ κ³΅ν΅ ν¬λ§·μ΄ νμνλ€.
- ν
μ΄λΈ/νλ μ΄λ¦μ λͺ
λͺ
κ·μΉμ μ νλ κ²μ΄ μ€μνλ€.
-> λ¨μν vs. 볡μν -> User vs. Users
-> _ vs. CamelCasing -> user_session_channel vs. UserSessionChannel
π SQL DDL - ν
μ΄λΈ ꡬ쑰 μ μ μΈμ΄
- CREATE TABLE -> ν
μ΄λΈ μμ±
- Primary key μμ±μ μ§μ ν μ μμΌλ 무μλλ€.
- Primary key uniqueness
- Big Data λ°μ΄ν°μ¨μ΄νμ°μ€μμλ μ§μΌμ§μ§ μλλ€.(Redshift, Snowflake, BigQuery)
- λλμ λ μ½λλ₯Ό μΆκ°ν λ μ±λ₯μ΄ μ νλλ€. -> νλμ© λ€ νμΈν΄μΌ νκΈ° λλ¬Έ
- CTAS : CREATE TABLE table_name AS SELECT (ν
μ΄λΈ μμ± + λ΄μ© μΆκ°)
- vs. CREATE TABLE and thenm INSERT
CREATE TABLE raw_data.user_session_channel(
userid int,
sessionid varchar(32) primary key,
channel varchar(32)
);
π SQL DML - ν
μ΄λΈ λ°μ΄ν° μ‘°μ μΈμ΄
-
λ μ½λ μ§μ
- SELECT FROM : ν
μ΄λΈμμ λ μ½λμ νλλ₯Ό μ½μ΄μ€λλ° μ¬μ©
- WHERE : λ μ½λ μ ν 쑰건μ μ§μ
- GROUP BY : μ 보λ₯Ό κ·Έλ£Ή λ 벨μμ λ½λλ° μ¬μ©
-> DAU(μΌλ³), WAU(μ£Όλ³), MAU(μλ³) κ³μ°μ GROUP BYλ₯Ό νμλ‘ νλ€.
- ORDER BY : λ μ½λ μμλ₯Ό κ²°μ -> ASC(μ€λ¦), DESC(λ΄λ¦Ό) -> νλ μ΄λ¦ λμ μ«μ μ¬μ© κ°λ₯
- LIMIT N; : μμμλΆν° Nκ° λ§νΌ κ°μ Έμ¨λ€.
- λ³΄ν΅ λ€μμ ν
μ΄λΈμ μ‘°μΈν΄μ μ¬μ©νκΈ°λ νλ€.
-
λ μ½λ μμ
- INSERT INTO : ν
μ΄λΈμ λ μ½λλ₯Ό μΆκ°νλλ° μ¬μ©
- UPDATE FROM : ν
μ΄λΈ λ μ½λμ νλ κ° μμ
- DELETE FROM : ν
μ΄λΈμμ λ μ½λλ₯Ό μμ
-
DISTINCT : μ€λ³΅ μ κ±°
SELECT DISTINCT channel
FROM raw_data.user_session_channel;
- CASE WHEN
- νλ κ°μ λ³νμ μν΄ μ¬μ© κ°λ₯νλ€.
- CASE WHEN 쑰건 THEN μ°ΈμΌλ κ° ELSE κ±°μ§μΌ λ κ° END Field_name
- μ¬λ¬ 쑰건μ μ¬μ©νμ¬ λ³ν κ°λ₯
CASE
WHEN 쑰건1 THEN κ°1
WHEN 쑰건2 THEN κ°2
END Field_name
SELECT CASE
WHEN channel in ('Facebook', 'Instagram') THEN 'Social-Media'
WHEN channel in ('Google', 'Naver') THEN 'Search-Engine'
ELSE 'Something-Else'
END channel_type
FROM raw_data.user_session_channel;
π NULL
- κ°μ΄ μ‘΄μ¬νμ§ μμμ λνλ΄λ μμ. 0 or ""κ³Όλ λ€λ₯΄λ€.
- νλ μ§μ μ κ°μ΄ μλ κ²½μ° NULLλ‘ μ§μ κ°λ₯νλ€.
- ν
μ΄λΈ μ μμ λν΄νΈ κ°μΌλ‘λ μ§μ κ°λ₯νλ€.
- μ΄λ€ νλμ κ°μ΄ NULLμΈμ§ μλμ§ λΉκ΅νλ νΉμν λ¬Έλ²μ νμλ‘ νλ€.
- field1 is NULL or field1 is not NULL
- NULLμ΄ μ¬μΉμ°μ°μ μ¬μ©λλ κ²½μ°
- SELECT 0 + NULL, 0 - NULL, 0 * NULL, 0 / NULL
π COUNT
- COUNT(n) : μ±λλ³λ‘ μΉ΄μ΄νΈλ₯Ό νκ³ μΆμ κ²½μ° μ¬μ©
- ν κ·Έλ£Ή μμ λ μ½λκ° λͺκ°μΈμ§
SELECT channel, COUNT(1)
FROM raw_data.user_session_channel
GROUP BY 1;
- SELECT 쑰건μ λ§μ‘±νλ λ μ½λμ μ
SELECT COUNT(1)
FROM raw_data.user_session_channel;
- channelμ΄λ¦μ΄ FacebookμΈ λ μ½λ μ
SELECT COUNT(1)
FROM raw_data.user_session_channel
WHERE channel = 'Facebook';
SELECT COUNT(1) FROM count_test -> count_testμ κ°μ
SELECT COUNT(0) FROM count_test -> count_testμ κ°μ
SELECT COUNT(NULL) FROM count_test -> 0
SELECT COUNT(value) FROM count_test -> NULLμ΄ μλκ²μ κ°μ
SELECT COUNT(DISTINCT value) FROM count_test -> NULLμ΄ μλκ³ μ€λ³΅μ μ κ±°ν κ°μ
π WHERE
- IN
- WHERE channel in ('Google', 'Youtube')
-> WHERE channel = 'Google' OR channel = 'Youtube'
- NOT IN
- LIKE and ILIKE
- LIKEλ λμλ¬Έμλ₯Ό ꡬλΆνλ©° λ¬Έμμ΄μ μ°Ύλ κ² μ΄λ€.
- ILIKEλ λμλ¬Έμλ₯Ό ꡬλΆνμ§ μμΌλ©΄μ λ¬Έμμ΄μ μ°Ύλ κ²μ΄λ€.
- WHERE channel LIKE 'G%' -> 'G*'
- WHERE channel LIKE '%o%' -> '* o *'
- NOT LIKE or NOT ILIKE
- BETWEEN
- λ μ§ λ²μμ μΌμΉνλ κ²μ μ°Ύμ λ μ¬μ©νλ€.
- CASE WHEN μ¬μ΄μμλ μ¬μ© κ°λ₯νλ€.
π IN & LIKE/ILIKE
SELECT COUNT(1)
FROM raw_data.user_session_channel
WHERE channel in ('Google', 'Facebook');
SELECT DISTINCT channel
FROM FROM raw_data.user_session_channel
WHERE channel ILIKE '%o%';
SELECT COUNT(1)
FROM FROM raw_data.user_session_channel
WHERE channel ILIKE 'Google' or channel ILIKE 'Facebook';
SELECT DISTINCT channel
FROM FROM raw_data.user_session_channel
WHERE channel NOT ILIKE '%o%';
π STRING Function
- LEFT(str, N)
- REPLACE(str, exp1, exp2)
- UPPER(str)
- LOWER(str)
- LEN(str)
- LPAD, RPAD
- SUBSTRING
SELECT
LEN(channel),
UPPER(channel),
LOWER(channel),
LEFT(channel, 4),
FROM raw_data.user_session_channel;
π ORDER BY
- κΈ°λ³Έ μμλ μ€λ¦μ°¨μμ΄λ€.
-> ORDER BY 1 ASC
- λ΄λ¦Όμ°¨μμ DESCλ₯Ό μ¬μ©νλ€.
-> ORDER BY 1 DESC
- μ¬λ¬ μ΄λ‘ μ λ ¬ν λλ
-> ORDER BY 1 DESC,2,3
- NULLμ μμ
- NULLκ°λ€μ μ€λ¦μ°¨μ μΈ κ²½μ° λ§μ§λ§
- NULLκ°λ€μ λ΄λ¦Όμ°¨μ μΈ κ²½μ° μ²μ
- μ΄λ₯Ό λ°κΎΈκ³ μ νλ©΄ NULLS FIRST or NULLS LAST μ¬μ©
π Type Casting