실력이 조금씩 상승하고 있는것을 느낍니다. 난이도 Medium 단계의 문제를 풀었는데 풀이도 보지 않고 얼마 걸리지 않았네요.
문제의 요구사항은 다음과 같습니다.
- code 별, power 별 최소한의 코인이 필요한 데이터를 출력하라
- non-evil인 wand를 사야하며 id, age, coins_needed, power를 출력하라
- power를 기준으로 내림차순 정렬하며, 같은 power일경우 age를 기준으로 내림차순 정렬하라
Wands 테이블
id | code | coins_needed | power |
1 | 4 | 3688 | 8 |
2 | 3 | 9365 | 3 |
3 | 3 | 7187 | 10 |
4 | 3 | 734 | 8 |
5 | 1 | 6020 | 2 |
6 | 2 | 6773 | 7 |
7 | 3 | 9873 | 9 |
8 | 3 | 7721 | 7 |
9 | 1 | 1647 | 10 |
10 | 4 | 504 | 5 |
Wands_property 테이블
code | age | is_evil |
1 | 45 | 0 |
2 | 40 | 0 |
3 | 4 | 1 |
4 | 20 | 0 |
5 | 17 | 0 |
sample Output
9 45 1647 10
12 17 9897 10
1 20 3688 8
15 40 6018 7
19 20 7651 6
11 40 7587 5
10 20 504 5
18 40 3312 3
20 17 5689 3
5 45 6020 2
14 40 5408 1
풀이)
SELECT C.id, D.age, C.coins_needed, C.power FROM (SELECT A.id, A.code, A.coins_needed, A.power FROM Wands
A INNER JOIN (
SELECT code, min(coins_needed) as min_coins_needed, power FROM Wands
GROUP BY code, power
) B
WHERE A.coins_needed = B.min_coins_needed AND A.power = B.power AND A.code = B.code) C
INNER JOIN Wands_Property D
ON C.code = D.code
WHERE D.is_evil = 0
ORDER BY C.power DESC, D.age DESC
1. code 별, power 별 최소로 코인이 필요한 데이터를 구하기 위해서 그룹핑을 합니다.
2. 최소로 코인이 필요한 데이터의 id를 알아야하기 때문에 원본 테이블과 code 별, power 별 최소로 코인이 필요한 데이터를 구하기위해 그룹핑한 데이터를 조인합니다(셀프조인)
3. age를 구하기 위해 WandsProperty 테이블과 조인 후 문제가 요구하는 is_evil 값이 0인 행들을 구합니다.
4. 마지막으로 power를 기준으로 내림차순 정렬 후 age를 기준으로 내림차순 정렬합니다.
'DB' 카테고리의 다른 글
Real My SQL - 아키텍처(2) (0) | 2021.06.06 |
---|---|
Real My SQL - 아키텍처(1) (0) | 2021.06.06 |
SQL 문제풀이 5) (0) | 2020.12.19 |
SQL 문제풀이 4) (0) | 2020.12.18 |
SQL 문제풀이 3) (0) | 2020.12.17 |