본문 바로가기

SQL/LeetCode

[SQL] Top Travellers(LeetCode/Oracle)

안녕하세요!

 

이번 포스팅은 LeetCode에 있는 Top Travellers 문제를 OracleDB로 풀어보려고 합니다!

 

(모든 문제는 Oracle로 풀이하겠습니다.)

 

1. 문제 링크 : https://leetcode.com/problems/top-travellers/description/

 

2. 문제

Column name Type
id int
name varchar
Column name Type
id int
user_id int
distance int
[문제] Write a solution to report the distance traveled by each user.

Return the result table ordered by travelled_distance in descending order, if two or more users traveled the same distance, order them by their name in ascending order.

각 사용자가 이동한 거리를 조회하는 문제입니다.

 

3. 제출 쿼리 및 설명

 

1) USERS 테이블과 RIDES 테이블을 조인하고 각 회원 별로 총 이동거리를 합산한 값을 조회합니다.

USERS 테이블의 모든 회원의 이동거리를 조회하기 위해서 LEFT JOIN 합니다.

SELECT U.ID, U.NAME, SUM(R.DISTANCE) AS T
FROM USERS U, RIDES R
WHERE U.ID = R.USER_ID(+)
GROUP BY U.ID, U.NAME

2) 만약에 LEFT JOIN을 했을 때, RIDES 테이블에 이동한 거리가 없어서 NULL 값이라면 대신 0으로 바꿔서 조회합니다.

SELECT NAME, NVL(TOTAL_DISTANCE, 0) AS TRAVELLED_DISTANCE
FROM (
  SELECT U.ID, U.NAME, SUM(R.DISTANCE) AS TOTAL_DISTANCE
  FROM USERS U, RIDES R
  WHERE U.ID = R.USER_ID(+)
  GROUP BY U.ID, U.NAME
)
ORDER BY TRAVELLED_DISTANCE DESC, NAME ASC
;