SQL 문제풀이 복습
일 시작하고 한동안 쿼리 연습 할 일이 없었는데,
슬슬 다시 감을 살려야 할 때가 된 것 같다.
늘 그랬듯 조급해하지 말고 물방울 떨구듯이 쌓아올려 보자.
2837. Total Traveled Distance
풀이시간 01:35
간단한 join
SELECT u.user_id,
u.name,
Ifnull(Sum(distance), 0) AS "traveled distance"
FROM Users u
LEFT JOIN Rides r
ON u.user_id = r.user_id
GROUP BY 1,
2
ORDER BY 1;
2853. Highest Salaries Difference
풀이시간 02:27
window 함수 활용문제
SELECT Max(salary) - Min(salary) AS "salary_difference"
FROM (SELECT salary,
Rank()
OVER(
partition BY department
ORDER BY salary DESC) AS "ranking"
FROM Salaries
WHERE department IN ( 'Engineering', 'Marketing' )) a
WHERE ranking = 1;
2854. Rolling Average Steps
풀이시간 07:49
사흘 기준 이동평균을 구하는 문제.
문제에서 사흘이라는 조건을 정확히 줬기 때문에
다소 번거롭지만 join을 두 번만 하면 답을 얻을 수 있다.
다만 날짜가 더 길어질 경우(예컨대 1주일) join을 7번 할 수는 없으므로,
궁극적으로 window함수를 써서 해결할 줄 알아야 하겠다.
오늘은 이렇게라도 답을 얻었다는 것만 확인하고,
window함수를 써서 푸는 방법은 다음 번에 시도해 보기로.
SELECT s1.user_id,
s1.steps_date,
Round(( s1.steps_count + s2.steps_count
+ s3.steps_count ) / 3, 2) AS "rolling_average"
FROM Steps s1
JOIN Steps s2
ON s1.user_id = s2.user_id
JOIN Steps s3
ON s1.user_id = s3.user_id
AND Datediff(s1.steps_date, s2.steps_date) = 1
AND Datediff(s2.steps_date, s3.steps_date) = 1
ORDER BY 1,
2;