ํฐ์คํ ๋ฆฌ ๋ทฐ
[๋ฐ์ดํฐ๋ถ์์ ์ํ SQL ๋ ์ํผ] 5๊ฐ : ํ๋์ ๊ฐ ์กฐ์ํ๊ธฐ
์คํฑ 2023. 8. 11. 12:24๐ก โป ๋ฐ์ดํฐ ๊ฐ๊ณต์ ํ์์ฑ
๋ค๋ฃฐ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ ๋ถ์ ์ฉ๋๋ก ์์ ๋์ง ์์ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ฝ๋ ๊ฐ๋ง ์ ์ฅํ๊ณ , ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ฝ๋๊ฐ์ ์๋ฏธ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ์์! ์ด ๊ฒฝ์ฐ ๋ฆฌํฌํธ ์์ฑ ์ ์ด๋ ค์์ ๊ฒช์ ์ ์๋ค! → ๋ฐ์ดํฐ ๋ถ์์ ์ ํฉํ ํํ๋ก ๋ฏธ๋ฆฌ ๊ฐ๊ณตํ๊ธฐ
์ฐ์ฐํ ๋ ๋น๊ต ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋ค๊ณ ์ค๋ฅ๋ฅผ ํํผํ๊ธฐ ์ํ ๊ฒฝ์ฐ
- ๋ก๊ทธ ๋ฐ์ดํฐ์ ์ ๋ฌด ๋ฐ์ดํฐ์ ํ์์ด ์ผ์นํ์ง ์์ ์ ์์!
- ์ด๋ค ๊ฐ๊ณผ NULL ๊ฐ์ ์ฐ์ฐํ ๋ , NULL ์ด ๋์ค๋ ๊ฒฝ์ฐ ์์! ์ด ๊ฒฝ์ฐ ์๋ ์ด๋ค ๊ฐ์ ์ ๋ณด๊ฐ ๋ ์๊ฐ๋ฏ๋ก, ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด NULL์ด ๋ฐ์ํ์ง ์๋๋ก ํ๊ธฐ!
1. ์ฝ๋ ๊ฐ์ ๋ ์ด๋ธ๋ก ๋ณ๊ฒฝํ๊ธฐ
์ง๊ณํ ๋, ์ฝ๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ ์ด๋ธ๋ก ๋ณ๊ฒฝ → CASE ๋ฌธ ์ด์ฉ
CASE WHEN <์กฐ๊ฑด์> THEN <์กฐ๊ฑด์ ๋ง์กฑํ ๋์ ๊ฐ> END
SELECT user_id,
CASE
WHEN register_device = 1 THEN '๋ฐ์คํฌํฑ'
WHEN register_device = 2 THEN '์ค๋งํธํฐ'
WHEN register_device = 3 THEN '์ ํ๋ฆฌ์ผ์ด์
'
ELSE ''
END AS device_name
FROM mst_users;
*๋ฐ์ดํฐ ๋ณํ์ CASE๋ฌธ ๋ง์ด ์ฌ์ฉ๋๋ฏ๋ก ๋ฐ๋์ ๊ธฐ์ต!
2. URL์์ ์์ ์ถ์ถํ๊ธฐ
์ ๊ทผ ๋ก๊ทธ ํ ์ด๋ธ - ์ต์ํ์ ์๊ฑด์ผ๋ก ๋ ํผ๋ฌ์ url์ ์ ์ฅํด๋ ๊ฒ!
๋ ํผ๋ฌ๋ก ์ด๋ค ์น ํ์ด์ง๋ฅผ ๊ฑฐ์ณ ๋์ด์๋์ง ํ๋ณํ๊ธฐ
ํ์ด์ง ๋จ์๋ก ์ง๊ณํ๋ฉด ๋ฐ๋๊ฐ ๋๋ฌด ์์ ๋ณต์ก → ํธ์คํธ ๋จ์๋ก ์ง๊ณ
- ์ด๋, ์ ๊ทํํ์์ผ๋ก ํธ์คํธ ์ด๋ฆ์ ํจํด ์ถ์ถํด์ผ ํจ!
SELECT
stamp, substring(referrer from 'https?://([^/]*)') AS referrer_host FROM access_log;
URL์์ ๊ฒฝ๋ก์ ์์ฒญ ๋งค๊ฐ๋ณ์ ๊ฐ ์ถ์ถํ๊ธฐ
- path ๋ณ์๋ก ํธ์คํธ ๋จ์ ๋ค์ ์ฃผ์ ์ถ์ถ
-id ๋ณ์๋ก ‘?id = 001’ ๋ถ๋ถ์์ ์ซ์๋ง ์ถ์ถ
SELECT
stamp, url, substring(url from '//[^/]+([^?#]+)') as path,
substring(url from 'id=([^&]*)') AS id
FROM access_log;
3. ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ถํดํ๊ธฐ
- ๋ฌธ์์ด ์๋ฃํ์ ๋ฒ์ฉ์ ์ด๋ฏ๋ก, ๋ ์ธ๋ถ์ ์ผ๋ก ๋ถํดํด์ผ ํจ!
- ex) ์์ด ๋ฌธ์ฅ์ ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํด์ ํ๋ํ๋์ ๋จ์ด๋ก ๊ตฌ๋ถ, ์ผํ๋ก ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ผ ํ๋ํ๋์ ๊ฐ์ ์ถ์ถ
- ๋ก๊ทธ ์ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ด์ง ๊ณ์ธต ๋๋๊ธฐ → URL๊ฒฝ๋ก๋ฅผ ์ฌ๋์๋ก ๋ถํ
- split_part ๋ฅผ ์ด์ฉํด n๋ฒ์งธ ์์ ์ถ์ถํ๊ธฐ!
# ๊ฒฝ๋ก๋ฅผ ์ฌ๋์๋ก ์๋ผ ๋ฐฐ์ด๋ก ๋ถํ ํ๊ธฐ
# ๊ฒฝ๋ก๊ฐ ๋ฐ๋์ ์ฌ๋์๋ก ์์ํ๋ฏ๋ก 2๋ฒ์งธ ์์๊ฐ ๋ง์ง๋ง ๊ณ์ธต
SELECT
stamp, url, split_part(substring(url from '//[^/]+([^?#]+)'),'/',2) as path1,
split_part(substring(url from '//[^/]+([^?#]+)'),'/',3) as path2
FROM access_log;
4. ๋ ์ง์ ํ์์คํฌํ ๋ค๋ฃจ๊ธฐ
ํ์ฌ ๋ ์ง์ ํ์์คํฌํ ์ถ์ถํ๊ธฐ
- PostgreSQL์์๋ CURRENT_TIMESTAMP์ ๋ฆฌํด ๊ฐ์ผ๋ก ํ์์กด์ด ์ ์ฉ๋ ํ์์คํฌํ ์๋ฃํ์ด ๋์ด!
- ๋ฆฌํด๊ฐ์ ์๋ฃํ์ ๋ง์ถ๊ธฐ ์ํด์๋ LOCALTIMESTAMP๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค!
SELECT
CURRENT_DATE AS dt, CURRENT_TIMESTAMP AS stamp, LOCALTIMESTAMP as lcstamp;
# ํ์์กด์ ์ ์ฉํ๊ณ ์ถ์ง ์์ผ๋ฉด LOCALTIME STAMP ์ฌ์ฉ
์ง์ ํ ๊ฐ์ ๋ ์ง/์๊ฐ ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ
- ํ์ฌ ์๊ฐ์ด ์๋ ๋ฌธ์์ด๋ก ์ง์ ํ ๋ ์ง์ ์๊ฐ์ ๊ธฐ๋ฐ์ ๋ ์ง ์๋ฃํ๊ณผ ํ์ ์คํฌํ ์๋ฃํ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
- CAST(value AS type) ํจ์ ์ฌ์ฉ!
# ๋ฌธ์์ด์ ๋ ์ง / ํ์์คํฌํ๋ก ๋ณํํ๊ธฐ
# CAST(value AS type)
SELECT
CAST('2016-01-30' AS date) AS dt, CAST('2016-01-30 12:00:00' AS timestamp) AS stamp;
- type value์ฌ์ฉ
SELECT
date '2016-01-30' AS dt, timestamp '2016-01-30 12:00:00' AS stamp;
- value::type ์ฌ์ฉ
SELECT
'2016-01-30'::date AS dt, '2016-01-30 12:00:00'::timestamp AS stamp;
๋ ์ง/์๊ฐ์์ ํน์ ํ๋ ์ถ์ถํ๊ธฐ
- timestamp ์๋ฃํ์์ ํน์ ํ๋๊ฐ (๋ /์) ์ถ์ถํ๊ธฐ! → EXTRACT ํจ์ ์ฌ์ฉ
SELECT
stamp
,EXTRACT(YEAR FROM stamp) AS year
,EXTRACT(MONTH FROM stamp) AS month
,EXTRACT(DAY FROM stamp) AS day
,EXTRACT(HOUR FROM stamp) AS hour
FROM (SELECT CAST('2016-01-30 12:00:00' AS timestamp) AS stamp) AS t;
โ AS t ํด์ฃผ๋ ์ด์ : PostgreSQL ์์๋ FROM ์ ์๋ธ์ฟผ๋ฆฌ์ alias ๋ฅผ ํํ ์ฌ์ฉํด์ผํ๋ค.
FROM ์ ๋ด์ subquery ์๋ ๋ฐ๋์ alias ๋ฅผ ๊ฐ์ ธ์ผ๋ง ํจ!
- timestamp๋ฅผ ๋จ์ํ ๋ฌธ์์ด์ฒ๋ผ ์ทจ๊ธํด์ ๋ฌธ์์ด ์กฐ์์ผ๋ก ํ๋ ์ถ์ถ →SUBSTRING ํจ์ ์ฌ์ฉ
SELECT
stamp
,substring(stamp, 1, 4) AS year # 1๋ถํฐ 4๊ฐ
,substring(stamp, 6, 2) AS month
,substring(stamp, 9, 2) AS day
,substring(stamp, 12, 2) AS hour
, substring(stamp, 1,7) AS year_month # ์ฐ๊ณผ ์ ํจ๊ป ์ถ์ถ
FROM (SELECT CAST('2016-01-30 12:00:00' AS text) AS stamp) AS t;
# ๋ฌธ์์ด ์๋ฃํ์ผ๋ก text ์ฌ์ฉ!
5. ๊ฒฐ์๊ฐ์ ๋ํดํธ ๊ฐ์ผ๋ก ๋์นํ๊ธฐ
- NULL์ด ๋ค์ด๊ฐ ์๋ ๊ฒฝ์ฐ, NULL๊ณผ ๋ฌธ์์ด ๊ฒฐํฉ → NULL / NULL๊ณผ ์ซ์ ์ฌ์น์ฐ์ฐ → NULL
๊ตฌ๋งค์ก์์ ํ ์ธ ์ฟ ํฐ ๊ฐ์ ์ ์ธํ ๋งค์ถ ๊ธ์ก ๊ตฌํ๊ธฐ
SELECT
purchase_id, amount, coupon, amount - coupon as discount_amount1,
amount - COALESCE(coupon, 0) AS discount_amount2
FROM purchase_log_with_coupon;
โ COALESCE(column1, column2,...) : ์ฒซ๋ฒ์งธ ์ธ์๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ธํ๋๋ฐ, ์ฒ์์ผ๋ก NULL์ด ์๋ ๊ฐ์ ๋ง๋๋ฉด ๊ทธ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์ → coupon์ด NULL๊ฐ์ด๋ฉด 0์ ์ถ๋ ฅํ๋๋ก!
'SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- SELECT๋ฌธ ์ ์๋ธ์ฟผ๋ฆฌ
- WHERE๋ฌธ ์ง๊ณํจ์
- ํ์ด๋ธ๋ฆฌ๋ ํํฐ๋ง
- rag ๋ค์ค๋ฌธ์ ํ์ฉ
- SET๋ฌธ
- ๊ณ ์ ์ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ
- reranker ์๋ ๊ฐ์
- cold-start
- ๋ค์ค GROUP BY
- SQL
- reranker
- SQL๋ ์ํผ
- NULL AS
- ํ๋์ ํ ์ด๋ธ์ ๋ํ ์กฐ์
- WHERE์ ์๋ธ์ฟผ๋ฆฌ
- treer๊ตฌ์กฐ
- llm reranker
- pointwise reranker
- ์ฌ๋ฌ๊ฐ ๊ฐ์ ๋ํ ์กฐ์
- SASRec
- ์๋ธ์ฟผ๋ฆฌ
- ์๊ณ ๋ฆฌ์ฆ
- ์จ๊ฒจ์ง์กฐ๊ฑด
- Lagrange Multipler
- ์ถ์ฒ์์คํ
- ์ฐ๊ด๊ท์น๋ถ์
- ORDER BY LIMIT
- ์ด์ฝํ
- groupby ๋ค์ค
- NULL์ธ ์ด ๋ง๋ค์ด์ฃผ๊ธฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |