출처: https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true
풀어야하는 포인트
*) 같은 AGE와 POWER에서는 COINS_NEEDED가 가장 작은걸 출력
[내가 작성한 쿼리] - 오답
SELECT w.id, wp.age, MIN(w.coins_needed) OVER (PARTITION BY wp.age) as min_coins, w.power
FROM Wands W
INNER JOIN Wands_Property WP ON W.CODE = WP.CODE
WHERE WP.is_evil = 0
ORDER BY w.power, wp.age
[정답 쿼리]
SELECT id, age, coins_needed, power
FROM(
SELECT w.id, wp.age, w.coins_needed, w.power, ROW_NUMBER() OVER(PARTITION BY age,power ORDER BY coins_needed) rn
ㄴ 같은 나이와 같은 힘을 가지고 있으면 그 파티션 안에서 가장 저렴한 COINS을 추출하기
FROM Wands W
INNER JOIN Wands_Property WP ON W.CODE = WP.CODE
WHERE WP.is_evil = 0
ORDER BY w.power, wp.age ) t
WHERE rn=1 -- 파티션 안에서 랭킹이 1인 WANDS들만 뽑기
ORDER BY power DESC, age DESC
출처: https://www.hackerrank.com/challenges/weather-observation-station-20/problem
[oracle 함수 문 사용]
SELECT ROUND(MEDIAN(LAT_N),4)
FROM STATION
[WINDOW 함수1]
SELECT ROUND(AVG(LAT_N,4)) -- 평균을 내줘
FROM(
SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) AS ROW_NUM -- 순위
,COUNT(*) OVER()N --총 데이터 개수
,LAT_N
FROM STATION
) T
WHERE CASE WHEN MOD(N,2) = 1 THEN ROW_NUM =(N+1)/2 --전체 행의 개수가 홀수 일 때에는 (N+1)/2 지점에 위치해 있는 얘를 데려와
ELSE ROW_NUM IN (N/2, (N/2)+1) -- 그 외 행의 개수가 짝수개일 떄는 2개를 들고와서
END
[WINDOW 함수2]
SELECT ROUND(AVG(LAT_N),4)
FROM(
SELECT LAT_N
,PERCENT_RANK() OVER (ORDER BY LAT_N) P_RN
FROM STATION ) T
WHERE P_RN = 0.5