LeetCode에서 SQL50 문제들을 풀어보았습니다.
이번 글에서는 SQL50 문제 중 Subqueries 7개를 풀어보겠습니다.
각 문제의 설명과 함께 SQL 풀이 코드를 제공하니, 차근차근 따라와 보세요! 🚀
아래는 해당 문제를 풀어볼 수 있는 링크입니다!
https://leetcode.com/studyplan/top-sql-50
📝 1978. Employees Whose Manager Left the Company
🔹 관리자가 회사를 떠난 직원
급여가 $30000 미만이고 관리자가 회사를 떠난 직원의 ID를 찾으십시오. 관리자가 회사를 떠나면 직원 테이블에서 해당 정보가 삭제되지만 보고서에는 여전히 관리자 ID가 떠난 관리자로 설정되어 있습니다.
Employee_id별로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- 급여가 $30,000 미만인 직원 중 관리자가 떠난 경우의 직원 ID 조회
- 관리자가 떠난 경우 직원 테이블에서 삭제됨
- Employee_id 기준으로 정렬
✅ SQL 풀이
SELECT a.employee_id
FROM Employees a
LEFT JOIN Employees b
ON a.manager_id = b.employee_id
WHERE a.manager_id IS NOT NULL
AND b.employee_id IS NULL
AND a.salary < 30000
ORDER BY 1
📝 626. Exchange Seats
🔹 좌석 교환
연속된 두 학생마다 좌석 ID를 바꾸는 솔루션을 작성하세요. 학생 수가 홀수인 경우 마지막 학생의 ID는 교환되지 않습니다.
id를 기준으로 오름차순으로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- 연속된 두 학생의 좌석을 교환
- 학생 수가 홀수인 경우 마지막 학생은 그대로 유지
- id 기준 오름차순 정렬
✅ SQL 풀이
WITH last_seat AS (
SELECT MAX(id) AS last
FROM Seat
)
SELECT id
, CASE WHEN last % 2 = 1 AND id = last THEN student
WHEN id % 2 = 1 THEN LEAD(student) OVER(ORDER BY id)
WHEN id % 2 = 0 THEN LAG(student) OVER(ORDER BY id)
END AS student
FROM Seat
, last_seat
ORDER BY id
반응형
📝 1341. Movie Rating
🔹 영화 평가
다음에 대한 솔루션을 작성하세요.
- 가장 많은 영화를 평가한 사용자의 이름을 찾으십시오. 동점인 경우 사전순으로 더 작은 사용자 이름을 반환합니다.
- 2020년 2월 평균 평점이 가장 높은 영화 이름을 찾습니다. 동점인 경우 사전순으로 더 작은 영화 이름을 반환합니다.
🔍 문제 설명
- 가장 많은 영화를 평가한 사용자의 이름 조회 (동점 시 사전순)
- 2020년 2월 평균 평점이 가장 높은 영화 이름 조회 (동점 시 사전순)
✅ SQL 풀이
(
SELECT b.name AS results
FROM MovieRating a
LEFT JOIN Users b ON a.user_id = b.user_id
GROUP BY a.user_id
ORDER BY COUNT(0) DESC, b.name
LIMIT 1
)
UNION ALL
(
SELECT b.title AS results
FROM MovieRating a
LEFT JOIN Movies b ON a.movie_id = b.movie_id
WHERE YEAR(a.created_at) = '2020'
AND MONTH(a.created_at) = '02'
GROUP BY a.movie_id
ORDER BY AVG(a.rating) DESC, b.title
LIMIT 1
)
📝 1321. Restaurant Growth
🔹 레스토랑 성장
당신은 식당 주인이고 가능한 확장을 분석하려고 합니다(매일 적어도 한 명의 고객이 있을 것입니다).
7일 기간(즉, 오늘 + 6일 전) 동안 고객이 지불한 금액의 이동 평균을 계산합니다. average_amount는 소수점 이하 두 자리로 반올림되어야 합니다.
Visited_on을 기준으로 오름차순으로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- 7일 이동 평균 계산
- 소수점 이하 두 자리 반올림
- Visited_on 기준 오름차순 정렬
✅ SQL 풀이
SELECT visited_on
, amount
, ROUND(amount / 7, 2) AS average_amount
FROM (
SELECT visited_on
, SUM(amount) OVER(ORDER BY visited_on RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW) AS amount
, MIN(visited_on) OVER() AS first_date
FROM Customer
) sub
WHERE visited_on >= first_date + 6
GROUP BY visited_on
728x90
📝 602. Friend Requests 2: Who Has the Most Friends
🔹 친구 요청 2: 친구가 가장 많은 사람
가장 많은 친구와 가장 많은 친구 수를 가진 사람을 찾는 솔루션을 작성하세요.
테스트 케이스는 한 사람만이 가장 많은 친구를 갖도록 생성됩니다.
🔍 문제 설명
- 친구 수가 가장 많은 사람의 ID 및 친구 수 조회
- 테스트 케이스는 한 명만 최대 친구 수를 가지도록 구성됨
✅ SQL 풀이
WITH request_and_accept AS (
SELECT requester_id AS id
, COUNT(0) AS num
FROM RequestAccepted
GROUP BY requester_id
UNION ALL
SELECT accepter_id AS id
, COUNT(0) AS num
FROM RequestAccepted
GROUP BY accepter_id
)
SELECT id
, SUM(num) AS num
FROM request_and_accept
GROUP BY id
ORDER BY num DESC
LIMIT 1
📝 585. Investments in 2016
🔹 2016년 투자
다음과 같은 모든 보험 계약자에 대해 2016년 tiv_2016의 모든 총 투자 가치 합계를 보고하는 솔루션을 작성하세요.
- 한 명 이상의 다른 보험 계약자와 동일한 tiv_2015 값을 갖고,
- 다른 보험 계약자와 동일한 도시에 위치하지 않습니다.
- (즉, (lat, lon) 속성 쌍은 고유해야 합니다).
tiv_2016을 소수점 이하 두 자리로 반올림합니다.
🔍 문제 설명
- 동일한 tiv_2015 값을 가진 보험 계약자 조회
- (lat, lon)이 다른 보험 계약자와 중복되지 않아야 함
- tiv_2016을 소수점 이하 두 자리 반올림
✅ SQL 풀이
WITH tiv_2015 AS (
SELECT tiv_2015
FROM Insurance
GROUP BY tiv_2015
HAVING COUNT(0) > 1
)
SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM Insurance a
JOIN tiv_2015 b
ON a.tiv_2015 = b.tiv_2015
WHERE (a.lat, a.lon) NOT IN (
SELECT lat
, lon
FROM Insurance
GROUP BY lat
, lon
HAVING COUNT(0) > 1
)
📝 185. Department Top Three Salaries
🔹 부서 상위 3개 연봉
회사의 경영진은 회사의 각 부서에서 누가 가장 많은 돈을 벌고 있는지 확인하는 데 관심이 있습니다. 한 부서의 고소득자는 해당 부서의 상위 3개 고유 급여에 포함되는 급여를 받는 직원입니다.
각 부서에서 고소득 직원을 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- 각 부서에서 상위 3명의 고소득 직원 조회
- 동일 급여자가 있을 경우 dense_rank() 사용
✅ SQL 풀이
WITH salary_rank AS (
SELECT b.name AS department
, a.name
, a.salary
, DENSE_RANK() OVER(PARTITION BY b.id ORDER BY a.salary DESC) AS rnk
FROM Employee a
LEFT JOIN Department b
ON a.departmentId = b.id
)
SELECT department AS Department
, name AS Employee
, salary AS Salary
FROM salary_rank
WHERE rnk < 4
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode] 175. Combine Two Tables (4) | 2025.02.20 |
---|---|
[LeetCode SQL50] - Advanced String Functions / Regex / Clause 문제풀이 (2) | 2025.02.19 |
[LeetCode] SQL50 - Advanced Select and Joins 문제풀이 (0) | 2025.02.18 |
[LeetCode] SQL50 - Sorting and Grouping 문제풀이 (0) | 2025.02.17 |
[LeetCode] SQL50 - Basic Aggregate Functions 문제풀이 (2) | 2025.02.13 |