64. ๐Ÿฉธ SQL - cte two steps

Jasonยท2026๋…„ 2์›” 3์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
47/47

SQL ๋‚ด๊ฐ€ ํ‹€๋ฆฐ ๊ฒƒ๋“ค #64 โ€” CTE 2๊ฐœ ๊ตฌ์กฐ: GROUP BY ๋จผ์ € โ†’ ROW_NUMBER ๋‚˜์ค‘!


๐Ÿค” ๋ฌธ์ œ ์ƒํ™ฉ

"์ง€์—ญ๋ณ„ ๋งค์ถœ 1๋“ฑ ๋งค์žฅ"์„ ๊ตฌํ•˜๋ ค๋Š”๋ฐ, CTE 1๊ฐœ์—์„œ SUM์ด๋ž‘ ROW_NUMBER๋ฅผ ๋™์‹œ์— ํ•˜๋ ค ํ–ˆ๋‹ค...

-- โŒ ๊ฐ™์€ SELECT์—์„œ ๋ณ„์นญ ์ฐธ์กฐ ๋ถˆ๊ฐ€!
SELECT 
  SUM(amount) AS total_amount,
  ROW_NUMBER() OVER(ORDER BY total_amount DESC) AS rn
-- total_amount๋ฅผ ๋ฐ”๋กœ ์ฐธ์กฐ ๋ชป ํ•จ!

๐Ÿ’ก ํ•ด๊ฒฐ: CTE 2๊ฐœ๋กœ ๋‚˜๋ˆ„๊ธฐ!


1๋‹จ๊ณ„ CTE: ๋งค์žฅ๋ณ„ ์ด ๋งค์ถœ (GROUP BY)

WITH cte AS (
  SELECT 
    st.region, st.store_name,
    SUM(sa.amount) AS total_amount
  FROM stores st
  JOIN sales sa ON st.id = sa.store_id
  GROUP BY st.id, st.region, st.store_name
)
regionstore_nametotal_amount
์„œ์šธ๊ฐ•๋‚จ์ 800000
์„œ์šธํ™๋Œ€์ 1050000
๊ฒฝ๊ธฐํŒ๊ต์ 550000

๋งค์žฅ๋‹น 1์ค„๋กœ ์ค„์–ด๋“ฆ!


2๋‹จ๊ณ„ CTE: ์ง€์—ญ๋ณ„ ์ˆœ์œ„ (ROW_NUMBER)

, cte_rn AS (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY region ORDER BY total_amount DESC) AS rn
  FROM cte
)
regionstore_nametotal_amountrn
์„œ์šธํ™๋Œ€์ 10500001
์„œ์šธ๊ฐ•๋‚จ์ 8000002
๊ฒฝ๊ธฐํŒ๊ต์ 5500001

๋งค์žฅ๋‹น 1์ค„์ด๋‹ˆ๊นŒ ์ˆœ์œ„๊ฐ€ ์ •ํ™•!


3๋‹จ๊ณ„: 1๋“ฑ๋งŒ!

SELECT region, store_name, total_amount
FROM cte_rn
WHERE rn = 1
regionstore_nametotal_amount
์„œ์šธํ™๋Œ€์ 1050000
๊ฒฝ๊ธฐํŒ๊ต์ 550000

โš ๏ธ ์™œ CTE 1๊ฐœ๋กœ ์•ˆ ๋ผ?

์œˆ๋„์šฐ ํ•จ์ˆ˜๋กœ ํ•˜๋ฉด?

SUM(amount) OVER(PARTITION BY store_id) AS total_amount
store_nameamounttotal_amount
๊ฐ•๋‚จ์ 500000800000
๊ฐ•๋‚จ์ 300000800000
ํ™๋Œ€์ 4500001050000
ํ™๋Œ€์ 6000001050000

๊ฐ™์€ ๋งค์žฅ์ด ์—ฌ๋Ÿฌ ์ค„! ROW_NUMBER ์ˆœ์œ„๊ฐ€ ๊ผฌ์ž„! ๐Ÿ˜ฑ


โš ๏ธ GROUP BY ์ฃผ์˜!

SELECT์— ์žˆ๋Š” ์ปฌ๋Ÿผ์€ GROUP BY์—๋„!

SELECT st.region, st.store_name, SUM(sa.amount)
       โ†‘            โ†‘              โ†‘
    GROUP BY     GROUP BY      ์ง‘๊ณ„ํ•จ์ˆ˜ OK!

๊ฐ™์€ ์ด๋ฆ„ ๋งค์žฅ ๋Œ€๋น„ โ†’ id๋„ ๋„ฃ๊ธฐ

GROUP BY st.id, st.region, st.store_name

๐Ÿ“Œ CTE 2๊ฐœ ํŒจํ„ด ์ •๋ฆฌ

๋‹จ๊ณ„์—ญํ• ํ–‰ ๋ณ€ํ™”
CTE 1GROUP BY (์ง‘๊ณ„)์ค„์–ด๋“ฆ!
CTE 2ROW_NUMBER (์ˆœ์œ„)์œ ์ง€
SELECTWHERE rn = 1 (ํ•„ํ„ฐ)์ค„์–ด๋“ฆ!

๐ŸŽฏ ์ด ํŒจํ„ด์ด ํ•„์š”ํ•œ ๋ฌธ์ œ

"~๋ณ„ 1๋“ฑ์„ ๊ตฌํ•˜๋ผ" = CTE 2๊ฐœ!

  1. GROUP BY๋กœ ์ง‘๊ณ„
  2. ROW_NUMBER๋กœ ์ˆœ์œ„
  3. WHERE rn = 1

์ง‘๊ณ„ ํ›„ ์ˆœ์œ„ = CTE 2๊ฐœ! ๐Ÿ’ช

profile
Data Analyst | Thoughts Become Things. ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์—†๋‹ค. | www.linkedin.com/in/๋ช…์ˆ˜-์ œ-7ab843200

0๊ฐœ์˜ ๋Œ“๊ธ€