55. 🩸 SQL - window vs group by

JasonΒ·2026λ…„ 1μ›” 25일

SQL

λͺ©λ‘ 보기
38/47

μœˆλ„μš° ν•¨μˆ˜ vs GROUP BY β€” μ–Έμ œ 뭘 써야 ν•΄?


🚨🚨🚨 핡심 ꡬ별법 (μ΄κ²ƒλ§Œ κΈ°μ–΅!) 🚨🚨🚨

"행이 쀄어듀어야 ν•΄? μœ μ§€λ˜μ–΄μ•Ό ν•΄?"

.
.
.

ν–‰ κ°œμˆ˜μ‚¬μš©
쀄어듦 (그룹별 1개)β†’ GROUP BY
μœ μ§€λ¨ (원본 κ·ΈλŒ€λ‘œ)β†’ μœˆλ„μš° ν•¨μˆ˜

πŸ’‘ "~별" λ‚˜μ˜€λ©΄ β†’ 일단 GROUP BY λ¨Όμ €!

.
.
.
.
.
.
.
.
.
.


😡 ν”ν•œ μ‹€μˆ˜

문제 보자마자 "μ–΄ λ³΅μž‘ν•΄ 보여!" β†’ λ°”λ‘œ μœˆλ„μš° ν•¨μˆ˜!

β†’ μ˜€λ²„ μ—”μ§€λ‹ˆμ–΄λ§! πŸ’€


🎯 핡심 ꡬ별법

질문 ν•˜λ‚˜λ§Œ 해봐!

"행이 쀄어듀어야 ν•΄? μœ μ§€λ˜μ–΄μ•Ό ν•΄?"

ν–‰ κ°œμˆ˜μ‚¬μš©
쀄어듦 (그룹별 1개)GROUP BY
μœ μ§€λ¨ (원본 κ·ΈλŒ€λ‘œ)μœˆλ„μš° ν•¨μˆ˜

πŸ“Š μ˜ˆμ‹œλ‘œ 비ꡐ

ν…Œμ΄λΈ”: 학생 성적

ν•™μƒλ°˜μ μˆ˜
철수A90
영희A85
민수B95
μ§€μ˜B80

문제 1: "λ°˜λ³„ 평균 점수"

κ²°κ³Ό:
| 반 | 평균 |
|----|------|
| A | 87.5 |
| B | 87.5 |

β†’ 4ν–‰ β†’ 2ν–‰ (쀄어듦!)

SELECT 반, AVG(점수)
FROM 성적
GROUP BY 반

βœ… GROUP BY!


문제 2: "각 학생 점수 + 반 평균도 같이 λ³΄μ—¬μ€˜"

κ²°κ³Ό:
| 학생 | 반 | 점수 | λ°˜ν‰κ·  |
|------|-----|------|--------|
| 철수 | A | 90 | 87.5 |
| 영희 | A | 85 | 87.5 |
| 민수 | B | 95 | 87.5 |
| μ§€μ˜ | B | 80 | 87.5 |

β†’ 4ν–‰ β†’ 4ν–‰ (μœ μ§€!)

SELECT 학생, 반, 점수,
  AVG(점수) OVER(PARTITION BY 반) AS λ°˜ν‰κ· 
FROM 성적

βœ… μœˆλ„μš° ν•¨μˆ˜!


πŸ”‘ ν‚€μ›Œλ“œλ‘œ κ΅¬λ³„ν•˜κΈ°

GROUP BY 써야 ν•  λ•Œ

ν‚€μ›Œλ“œμ˜ˆμ‹œ
~별 합계/평균/개수"λΆ€μ„œλ³„ 평균 연봉"
~별 μ΅œλŒ€/μ΅œμ†Œ"νšŒμ‚¬λ³„ 졜고 맀좜"
κ·Έλ£Ήλ‹Ή 1개 κ²°κ³Ό"μΉ΄ν…Œκ³ λ¦¬λ‹Ή μƒν’ˆ 수"

μœˆλ„μš° ν•¨μˆ˜ 써야 ν•  λ•Œ

ν‚€μ›Œλ“œμ˜ˆμ‹œ
N번째"2번째 ꡬ맀 λ‚΄μ—­"
μˆœμœ„ λ§€κΈ°κ³  + 원본 μœ μ§€"μˆœμœ„μ™€ ν•¨κ»˜ 전체 λͺ©λ‘"
λˆ„μ "λˆ„μ  합계"
이전/λ‹€μŒ κ°’ 비ꡐ"μ „μ›” λŒ€λΉ„ 증감"
원본 + 집계값 같이"개인 점수 + 평균 같이"

πŸ§ͺ μ‹€μ „ νŒλ‹¨ 흐름

문제 읽음
    ↓
"κ²°κ³Ό ν–‰ κ°œμˆ˜κ°€ 쀄어듀어야 ν•΄?"
    ↓
   YES β†’ GROUP BY
    ↓
   NO β†’ "원본 ν–‰λ§ˆλ‹€ λ­”κ°€ 계산 ν•„μš”?"
           ↓
          YES β†’ μœˆλ„μš° ν•¨μˆ˜
           ↓
          NO β†’ κ·Έλƒ₯ SELECT

πŸ“ 였늘 ν‘Ό 문제둜 볡슡

Q3: λŒ€ν•™λ³„ 1~3μœ„ 학생 수

문제: 2015λ…„ 1~3μœ„ 학생이 μžˆλŠ” λŒ€ν•™λ³„λ‘œ

  • λŒ€ν•™λͺ…, μ΅œκ³ μˆœμœ„, ν•™μƒμˆ˜

νŒλ‹¨:

  • λŒ€ν•™λ³„ β†’ κ·Έλ£Ήν™”
  • ν•™μƒμˆ˜ β†’ 집계
  • κ²°κ³Ό: λŒ€ν•™λ‹Ή 1ν–‰

β†’ GROUP BY! βœ…

SELECT c.name, MIN(r.ranking), COUNT(*)
FROM students s
JOIN colleges c ON ...
JOIN rankings r ON ...
WHERE r.year = 2015 AND r.ranking IN (1,2,3)
GROUP BY c.id, c.name

λ§Œμ•½ λ¬Έμ œκ°€ μ΄λž¬λ‹€λ©΄?

"각 ν•™μƒμ˜ μˆœμœ„ + ν•΄λ‹Ή λŒ€ν•™ λ‚΄ λͺ‡ 등인지도 λ³΄μ—¬μ€˜"

β†’ 원본 μœ μ§€ + μΆ”κ°€ 계산

β†’ μœˆλ„μš° ν•¨μˆ˜! βœ…

SELECT s.name, r.ranking,
  ROW_NUMBER() OVER(PARTITION BY c.id ORDER BY r.ranking) AS λŒ€ν•™λ‚΄μˆœμœ„
FROM ...

βœ… ν•œ 쀄 정리

"ν–‰ 쀄이기 = GROUP BY"

"ν–‰ μœ μ§€ + 계산 μΆ”κ°€ = μœˆλ„μš° ν•¨μˆ˜"


🚨 μ‹€μˆ˜ λ°©μ§€ 체크리슀트

  • λ¬Έμ œμ—μ„œ μ›ν•˜λŠ” κ²°κ³Ό ν–‰ 개수 μƒκ°ν–ˆλ‚˜?
  • "~별" λ‚˜μ˜€λ©΄ 일단 GROUP BY λ¨Όμ € κ³ λ €!
  • μœˆλ„μš° ν•¨μˆ˜ μ“°κΈ° 전에 "정말 ν•„μš”ν•œκ°€?" 자문!
  • λ³΅μž‘ν•˜κ²Œ κ°€λ©΄ μ‹€μˆ˜λ§Œ λŠ˜μ–΄λ‚œλ‹€!

profile
Data Analyst | Thoughts Become Things. ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ ν•  수 μžˆλ‹€. ν•  수 μ—†λ‹€κ³  μƒκ°ν•˜λ©΄ ν•  수 μ—†λ‹€. | www.linkedin.com/in/λͺ…μˆ˜-제-7ab843200

0개의 λŒ“κΈ€