티스토리 뷰
🔹 손코딩 전략
- CTE로 단계 나누기 → 논리 표현 명확, 읽기 쉬움
- 윈도우 함수 적극 활용 → Top-N, 동점 처리 등
- 주석 활용 → 생각 과정 전달
- 우선 간단한 문제부터 풀고, 어려운 문제는 논리만 주석으로 표현
** LAG (참조열, 몇번째 이전행, 다음행이 없을떄 채울값)
** LEAD(참조열, 몇번째 다음행, 다음행이 없을 때 채울값)
문제 1. N등 구하기
테이블: Scores
| user_id | game_id | score | game_date |
- 각 game_id별 점수를 기준으로 2등 점수를 조회하시오.
- 2등이 없는 경우(게임이 1번만 있는 경우)는 결과에서 제외하시오.
문제 2. 월별 순위
테이블: Orders
| order_id | product_id | amount | order_date |
- 월별(YYYY-MM) product_id별 총 판매량(SUM amount)을 구하시오.
- 각 월별 판매량 순위(RANK)를 매겨 출력하시오.
- 결과 컬럼: month, product_id, total_amount, rank
문제 3. 전월 대비 증감
테이블: Sales
| month | product_id | revenue |
- product_id별로 월별 revenue를 조회하되,
전월 대비 증감액(revenue - 이전달 revenue)을 함께 출력하시오. - 결과 컬럼: month, product_id, revenue, diff_from_last_month
WITH diff_revenue AS (
SELECT
month,
product_id,
revenue,
revenue - LAG(revenue, 1, 0) OVER (
PARTITION BY product_id
ORDER BY month
) AS diff_from_last_month
FROM Sales
),
SELECT month, product_id, revenue, diff_from_last_month
FROM diff_revenue
ORDER BY product_id, month;
문제 4. 연속 출석일수
테이블: Attendance
| user_id | attend_date |
- 유저별로 연속 출석일수를 계산하시오.
- 결과는 user_id, attend_date, streak_count 형태로 출력하시오.
WITH streak_table AS (
SELECT
user_id,
attend_date,
CASE
WHEN DATEDIFF(
attend_date,
LAG(attend_date) OVER (PARTITION BY user_id ORDER BY attend_date)
) = 1
THEN 1
ELSE 0
END AS is_consecutive
FROM Attendance
),
streak_calc AS (
SELECT
user_id,
attend_date,
SUM(is_consecutive) OVER (
PARTITION BY user_id
ORDER BY attend_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) + 1 AS streak_count
FROM streak_table
)
SELECT user_id, attend_date, streak_count
FROM streak_calc
ORDER BY user_id, attend_date;
문제 5. 팀별 최고 점수자
테이블: Users, Scores
Users
| user_id | team_id | user_name |
Scores
| user_id | score | game_date |
- 각 team_id별로 가장 높은 점수를 기록한 유저의 user_name과 score를 조회하시오.
- 동점일 경우 game_date가 가장 빠른 유저를 선택하시오.
WITH ranked_scores AS (
SELECT
u.team_id,
u.user_name,
s.score,
s.game_date,
ROW_NUMBER() OVER (
PARTITION BY u.team_id
ORDER BY s.score DESC, s.game_date ASC
) AS rn
FROM Users u
JOIN Scores s ON u.user_id = s.user_id
)
SELECT team_id, user_name, score, game_date
FROM ranked_scores
WHERE rn = 1;
'MySQL' 카테고리의 다른 글
| [MYSQL] 프로그래머스 - 멸종위기의 대장균 찾기 (0) | 2025.09.02 |
|---|---|
| [MySQL] 프로그래머스 - 특정 세대의 대장균 찾기 (0) | 2025.09.02 |
| [MySQL] 손코딩 연습 (윈도우함수, CTE, JOIN 등) - 1 (0) | 2025.09.02 |
| [MySQL] MySQL:: Too many connection... (1) | 2024.12.06 |
| [MySQL] 컬럼 타입 변경 (0) | 2023.04.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 논클러스터 인덱스
- cachedbodyhttpservletrequest
- 디비개발프로세스
- 재귀구문
- 디너요리추천
- 400에러관리
- MySQL
- 500에러관리
- 시청역숙소
- 신사동이자카야
- 유에이치스위트
- csv업로드
- httpcode
- 유에이치스위트서울스퀘어
- 바디캐싱
- MAC
- csv다운로드
- menu만들기
- 컬럼타입변경
- 데이터베이스
- 오리지널팬케이스하우스
- springboot
- 데이터업로드
- 사용자별메뉴
- 권한별메뉴만들기
- 시청역놀곳
- 오리지널팬케이스하우스 판교점
- 판교테크원타워맛집
- xcrunerror
- 스프링부트
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
글 보관함