SQLD
SQL 5일차 #LeetCodE
임재환
2025. 4. 27. 20:20
프로그래머스 SQL문제를 다 풀었으니 이제 리트코드에서 풀어보자!
난이도는 MED으로 설정하고,

확실히 문제가 프로그래머스와 확연히 다르다.
SQL은 뇌빼고 풀어도 다 풀 수 있는데 여기 문제는 코드짜기 전 어떻게 풀어야하는지 깊게 생각해야하는것같다. (나만 그럴수도)
복습할 문제
1. 3번 연속하는 등장하는 숫자 찾기 (180번)
Find all numbers that appear at least three times consecutively.
Return the result table in any order.
The result format is in the following example.
-- num이 같은 숫자로 연속 3번이상 등장할 경우 COUNT
-- n번째 id의 num과, n+1.., n+2의..num이 모두 같을 경우 COUNT -> WHERE?
-- 힌트: 조인 사용
SELECT DISTINCT A.num AS ConsecutiveNums
FROM Logs A
JOIN Logs B
ON B.id = A.id + 1
JOIN Logs C
ON C.id = A.id + 2
WHERE A.num = B.num and B.num = C.num
# 어떠한 숫자가 3번 이상 등장하는지 -> JOIN 2번, DISTINCT 사용
2. 각 부서 별로 최고의 연봉 갖는 사람의 이름 추출 (184번)
오답)
-- 부서별 MAX연봉 직원 찾기 ,any order
SELECT B.name AS Department, A.name AS Employee, MAX(A.salary) AS Salary
FROM Employee A
JOIN Department B
ON A.departmentId = B.id -- 직원이름이 어떠한 부서 아래 있는지 참조
GROUP BY B.name
문제 : 추출되는 A.name이 최고 연봉을 가지는 사람이 아님. (랜덤임)
만약 문제가 각 부서 별 최고 연봉금액이면 맞지만, 연봉이 얼마인지 + 그사람의 이름을 가져오려면 서브쿼리 써야함.
# 부서별 MAX연봉 직원 찾기 ,any order
SELECT B.name AS Department,
A.name AS Employee,
MAX(A.salary) AS Salary
FROM Employee A
JOIN Department B
ON A.DepartmentId = B.id
WHERE (A.departmentId, A.salary) IN -- 두개 이상을 비교하는 것이기 때문에 괄호써줘야함.
(
SELECT departmentId, MAX(salary) A.departmentId아님 -> 서브쿼리라서 테이블 내 컬럼명 그대로
FROM Employee
GROUP BY departmentId
)
서브쿼리를 쓴 이유 - 부서별로 가장 높은 salary를 미리 계산해서 메인쿼리와 비교해야 하기 때문입니다.
IN을 쓴 이유 - (departmentId, max salary) 조합 중 하나에 해당하는 직원들을 찾기 때문입니다.
정확히 숙지하고 가자!