250413_TIL

J Lee·2025년 4월 13일

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습

일 시작하고 한동안 쿼리 연습 할 일이 없었는데,
슬슬 다시 감을 살려야 할 때가 된 것 같다.

늘 그랬듯 조급해하지 말고 물방울 떨구듯이 쌓아올려 보자.


Leetcode

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;
profile
기본기를 소홀히 하지 말자

0개의 댓글