KATA#78

codataffee·2024년 7월 1일
0

CODEKATA

목록 보기
78/114
post-thumbnail

WHAT IS KATA?

KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.

이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.


- SQL


✔️ 문제 #1: Ollivander's Inventory

Wands Table:Wands_Property Table :

문제
Ollivander 상점에서 Ron은 Charlie의 오래된 부러진 지팡이를 대체할 새로운 지팡이를 찾고 있다. 각각의 high power, non-evil 지팡이를 구매하는 데 필요한 최소 금액을 결정하는 쿼리 작성

각각의 high power, non-evil 지팡이에 대해,
Ron이 구매해야 할 최소 금액을 결정하고,
그 지팡이의 ID, age, coins_needed, power 출력
결과는 power 기준 내림차순 정렬,
동일한 경우 age 기준 내림차순 정렬

✔️ 제출 쿼리

✔️ 쿼리 분석

# 지팡이 ID, AGE, COINS_NEEDED, POWER
SELECT W.ID, 
       WP.AGE, 
       W.COINS_NEEDED, 
       W.POWER
# WANDS 테이블과 WANDS_PROPERTY 테이블을 CODE 열로 조인
FROM WANDS W 
JOIN WANDS_PROPERTY WP
ON W.CODE = WP.CODE
# 서브쿼리 사용하여 최소 필요 금액 계산
JOIN 
    (
        # 각 나이와 성능 조합에 대해 최소 필요 금액 선택
        SELECT WP.AGE, 
               W.POWER, 
               MIN(W.COINS_NEEDED) AS MIN_COINS
        # WANDS 테이블과 WANDS_PROPERTY 테이블을 code 열로 조인
        FROM WANDS W 
        JOIN WANDS_PROPERTY WP
        ON W.CODE = WP.CODE
        # IS_EVIL 제외
        WHERE WP.IS_EVIL = 0
        # AGE와 POWER 기준으로 그룹화하여 최소 필요 금액 계산
        GROUP BY WP.AGE, W.POWER
    ) MC
# 서브쿼리 결과와 조인하여 최소 필요 금액인 지팡이 선택
ON WP.AGE = MC.AGE 
   AND W.POWER = MC.POWER 
   AND W.COINS_NEEDED = MC.MIN_COINS
# IS_EVIL 제외
WHERE WP.IS_EVIL = 0
# 성능 기준 내림차순, 동일 성능 시 나이 기준 내림차순 정렬
ORDER BY W.POWER DESC, 
         WP.AGE DESC

쿼리 작동 세부 내용 정리

  1. SELECT 절
# 지팡이 ID, AGE, COINS_NEEDED, POWER
SELECT W.ID, 
       WP.AGE, 
       W.COINS_NEEDED, 
       W.POWER
       
WANDS 테이블과 WANDS_PROPERTY 테이블에서 
지팡이의 ID, AGE, COINS_NEEDED, POWER 반환
  1. JOIN 절
# WANDS 테이블과 WANDS_PROPERTY 테이블을 CODE 열로 조인
FROM WANDS W 
JOIN WANDS_PROPERTY WP
ON W.CODE = WP.CODE

WANDS 테이블과 WANDS_PROPERTY 테이블을 code 열을 기준으로 조인
  1. 서브쿼리
# 서브쿼리 사용하여 최소 필요 금액 계산
JOIN 
    (
        # 각 나이와 성능 조합에 대해 최소 필요 금액 선택
        SELECT WP.AGE, 
               W.POWER, 
               MIN(W.COINS_NEEDED) AS MIN_COINS
        # WANDS 테이블과 WANDS_PROPERTY 테이블을 code 열로 조인
        FROM WANDS W 
        JOIN WANDS_PROPERTY WP
        ON W.CODE = WP.CODE
        # IS_EVIL 제외
        WHERE WP.IS_EVIL = 0
        # AGE와 POWER 기준으로 그룹화하여 최소 필요 금액 계산
        GROUP BY WP.AGE, W.POWER
    ) MC
# 서브쿼리 결과와 조인하여 최소 필요 금액인 지팡이 선택
ON WP.AGE = MC.AGE 
   AND W.POWER = MC.POWER 
   AND W.COINS_NEEDED = MC.MIN_COINS
   
서브쿼리에서 각 나이와 성능 조합에 대해 최소 필요 금액을 선택하여 조인
서브쿼리 내에서 WANDS와 WANDS_PROPERTY 테이블을 code 열로 조인
악한 지팡이를 제외하고, 나이와 성능 기준으로 그룹화하여 최소 필요 금액 계산
  1. WHERE 절
# IS_EVIL 제외
WHERE WP.IS_EVIL = 0

WANDS_PROPERTY 테이블에서 악한 지팡이 (is_evil = 1)를 제외
  1. ORDER BY 절
# 성능 기준 내림차순, 동일 성능 시 나이 기준 내림차순 정렬
ORDER BY W.POWER DESC, 
         WP.AGE DESC

✔️ CHECK POINT

  • SQL
    • 서브쿼리
# 서브쿼리 사용하여 최소 필요 금액 계산
JOIN 
    (
        # 각 나이와 성능 조합에 대해 최소 필요 금액 선택
        SELECT WP.AGE, 
               W.POWER, 
               MIN(W.COINS_NEEDED) AS MIN_COINS
        # WANDS 테이블과 WANDS_PROPERTY 테이블을 code 열로 조인
        FROM WANDS W 
        JOIN WANDS_PROPERTY WP
        ON W.CODE = WP.CODE
        # IS_EVIL 제외
        WHERE WP.IS_EVIL = 0
        # AGE와 POWER 기준으로 그룹화하여 최소 필요 금액 계산
        GROUP BY WP.AGE, W.POWER
    ) MC
# 서브쿼리 결과와 조인하여 최소 필요 금액인 지팡이 선택
ON WP.AGE = MC.AGE 
   AND W.POWER = MC.POWER 
   AND W.COINS_NEEDED = MC.MIN_COINS
   
서브쿼리에서 각 나이와 성능 조합에 대해 최소 필요 금액을 선택하여 조인
서브쿼리 내에서 WANDS와 WANDS_PROPERTY 테이블을 code 열로 조인
악한 지팡이를 제외하고, 나이와 성능 기준으로 그룹화하여 최소 필요 금액 계산

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보