728x90
https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true
- 문제
- non-evil이고 power와 age가 같다면 coins_needed는 최소여야 한다.
- id, age, coins_needed, power를 출력하라
- power 내림차순, age 내림차순 정렬
- 풀이 1
- 우선 power와 age가 같을 때 coins_needed를 가질려면 그룹화를 사용해야 한다.
- 서브 쿼리를 통해 각각의 경우 가장 작은 coins_needed를 구할 수 있다.
- 우선 power와 age가 같을 때 coins_needed를 가질려면 그룹화를 사용해야 한다.
- 코드 1
SELECT W.id, P.age, W.coins_needed, W.power
FROM (SELECT *
FROM Wands
-- 각각의 경우 가장 적은 coins_needed
WHERE (code,power,coins_needed) IN (SELECT code, power, MIN(coins_needed)
FROM Wands
GROUP BY code, power)) AS W
INNER JOIN (SELECT code, age
FROM Wands_Property
WHERE is_evil = 0) AS P
ON W.code = P.code
ORDER BY W.power DESC, P.age DESC;
- 풀이 2 - 윈도우 함수
- 윈도우 함수를 사용하여 age, power가 같은 경우 coins_needed의 순위를 매겨보기
- 윈도우 함수의 결과를 조건문에 사용할 수 없으므로 서브쿼리로 묶어서 순위가 1인 것 뽑기
- 윈도우 함수를 사용하여 age, power가 같은 경우 coins_needed의 순위를 매겨보기
SELECT W.id
, WP.age
, W.power
, W.coins_needed
, ROW_NUMBER() OVER (PARTITION BY WP.age, W.power ORDER BY coins_needed) rn
FROM Wands W
INNER JOIN Wands_Property WP
ON W.code = WP.code
WHERE is_evil = 0;
- 코드 2
SELECT id, age, coins_needed,power
FROM (
SELECT W.id
, WP.age
, W.power
, W.coins_needed
, ROW_NUMBER() OVER (PARTITION BY WP.age, W.power ORDER BY coins_needed) rn
FROM Wands W
INNER JOIN Wands_Property WP
ON W.code = WP.code
WHERE is_evil = 0
) t
WHERE t.rn = 1
ORDER BY power DESC, age DESC;
728x90
반응형
'TIL - 프로그래밍 > SQL' 카테고리의 다른 글
[리트코드] 262. Trips and Users - MySQL (0) | 2023.07.15 |
---|---|
[해커랭크] Weather Observation Station 20 - MySQL (0) | 2023.07.15 |
[해커랭크] Occupations - MySQL (0) | 2023.07.11 |
[프로그래머스] LV4. 입양 시각 구하기(2) - MySQL (0) | 2023.07.11 |
[리트코드] 185. Department Top Three Salaries - MySQL (0) | 2023.07.09 |
댓글