LeetCode에서 SQL50 문제들을 풀어보았습니다.
이번 글에서는 SQL50 문제 중 Basic Join 9개를 풀어보겠습니다.
각 문제의 설명과 함께 SQL 풀이 코드를 제공하니, 차근차근 따라와 보세요! 🚀
아래는 해당 문제를 풀어볼 수 있는 링크입니다!
https://leetcode.com/studyplan/top-sql-50
📝1378. Replace Employee ID With The Unique Identifier
🔹 직원 ID를 고유 식별자로 대체
각 사용자의 고유 ID를 표시하는 솔루션을 작성하세요.
사용자에게 고유 ID가 없으면 null만 표시하면 됩니다.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Employees 테이블에는 직원의 id와 name이 존재
- EmployeeUNI 테이블에는 직원의 id와 unique_id가 존재
- 직원 ID(id)를 기준으로 조인하여 해당 직원의 unique_id를 조회
✅ SQL 풀이
SELECT b.unique_id
, a.name
FROM Employees a
LEFT JOIN EmployeeUNI b
ON a.id = b.id
📝1068. Product Sales Analysis 1
🔹 상품 판매 분석 1
Sales 테이블의 각 sale_id에 대한 product_name, 연도 및 가격을 보고하는 솔루션을 작성하세요.
결과 테이블을 어떤 순서로든 반환합니다.
🔍 문제 설명
- Sales 테이블에는 product_id, year, price 존재
- Product 테이블에는 product_id, product_name 존재
- product_id를 기준으로 조인하여 product_name, year, price 조회
✅ SQL 풀이
SELECT b.product_name
, a.year
, a.price
FROM Sales a
JOIN Product b
ON a.product_id = b.product_id
📝1581. Customer Who Visited but Did Not Make Any Transactions
🔹 방문했으나 거래를 하지 않은 고객
거래 없이 방문한 사용자의 ID와 이러한 유형의 방문 횟수를 찾는 솔루션을 작성하세요.
임의의 순서로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- Visits 테이블에는 visit_id, customer_id 존재
- Transactions 테이블에는 visit_id, transaction_id 존재
- Transactions에 없는 visit_id를 기준으로 customer_id별 방문 횟수(count) 조회
✅ SQL 풀이
SELECT a.customer_id
, COUNT(a.visit_id) AS count_no_trans
FROM Visits a
LEFT JOIN Transactions b
ON a.visit_id = b.visit_id
WHERE b.transaction_id IS NULL
GROUP BY a.customer_id
반응형
📝197. Rising Temperature
🔹 온도 상승
이전 날짜(어제)에 비해 온도가 더 높은 모든 날짜의 ID를 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Weather 테이블에는 id, recordDate, temperature 존재
- 같은 테이블에서 하루 전(recordDate - 1)과 비교하여 온도가 더 높은 경우 해당 id 조회
✅ SQL 풀이
SELECT a.id
FROM Weather a, Weather b
WHERE DATEDIFF(a.recordDate, b.recordDate) = 1
AND a.temperature > b.temperature
📝1661. Average Time Of Process per Machine
🔹 기계당 평균 처리 시간
각각 동일한 수의 프로세스를 실행하는 여러 컴퓨터가 있는 공장 웹사이트가 있습니다.
각 기계가 프로세스를 완료하는 데 걸리는 평균 시간을 구하는 솔루션을 작성하세요.
프로세스를 완료하는 데 걸리는 시간은 'end' 타임스탬프에서 'start' 타임스탬프를 뺀 시간입니다.
평균 시간은 머신의 모든 프로세스를 완료하는 데 걸린 총 시간을 실행된 프로세스 수로 나누어 계산합니다.
결과 테이블에는 machine_id와 함께 평균 시간(processing_time)이 있어야 하며 소수점 이하 3자리에서 반올림되어야 합니다.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Activity 테이블에는 machine_id, process_id, timestamp, activity_type 존재
- start와 end 타임스탬프 차이를 구해 기계별 평균 처리 시간 계산
- 평균 시간을 소수점 세 자리에서 반올림
✅ SQL 풀이
SELECT a.machine_id
, ROUND(AVG(b.timestamp - a.timestamp), 3) AS processing_time
FROM Activity a
LEFT JOIN Activity b
ON a.machine_id = b.machine_id
AND a.process_id = b.process_id
AND a.activity_type != b.activity_type
WHERE a.activity_type = 'start'
GROUP BY a.machine_id
📝577. Employee Bonus
🔹 직원 보너스
보너스가 1000 미만인 각 직원의 이름과 보너스 금액을 보고하는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Employee 테이블에는 empId, name 존재
- Bonus 테이블에는 empId, bonus 존재
- Bonus가 1000 미만이거나 NULL인 직원의 name, bonus 조회
✅ SQL 풀이
SELECT a.name
, b.bonus
FROM Employee a
LEFT JOIN Bonus b
ON a.empId = b.empId
WHERE b.bonus < 1000
OR b.bonus IS NULL
728x90
📝1280. Students and Examinations
🔹 학생과 시험
각 학생이 각 시험에 참석한 횟수를 구하는 풀이를 작성하세요.
Student_id와 subject_name으로 정렬된 결과 테이블을 반환합니다.
🔍 문제 설명
- Students 테이블에는 student_id, student_name 존재
- Subjects 테이블에는 subject_name 존재
- Examinations 테이블에는 student_id, subject_name 존재
- CROSS JOIN을 활용해 학생별 모든 과목을 매칭하고, LEFT JOIN으로 Examinations 정보 결합
✅ SQL 풀이
SELECT a.student_id
, a.student_name
, b.subject_name
, COUNT(c.student_id) AS attended_exams
FROM Students a
CROSS JOIN Subjects b
LEFT JOIN Examinations c
ON a.student_id = c.student_id
AND b.subject_name = c.subject_name
GROUP BY a.student_id
, a.student_name
, b.subject_name
ORDER BY a.student_id
, b.subject_name
📝570. Managers with at Least 5 Direct Reports
🔹 직속상관이 5명 이상인 관리자
5명 이상의 직속 부하 직원이 있는 관리자를 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Employee 테이블에서 managerId가 있는 직원들의 managerId를 기준으로 그룹화
- managerId가 5명 이상인 관리자 조회
✅ SQL 풀이
SELECT b.name
FROM Employee a
LEFT JOIN Employee b
ON a.managerId = b.id
GROUP BY b.id
HAVING COUNT(b.id) >= 5
📝1937. Confirmation Rate
🔹 확정률
사용자의 확인 비율은 'confirmed' 메시지 수를 요청한 전체 확인 메시지 수로 나눈 값입니다.
확인 메시지를 요청하지 않은 사용자의 확인 비율은 0입니다.
확인 비율은 소수점 이하 두 자리에서 반올림합니다.
각 사용자의 확인률을 구하는 솔루션을 작성하세요. 어떤 순서로든 결과 테이블을 반환합니다.
🔍 문제 설명
- Signups 테이블에는 user_id 존재
- Confirmations 테이블에는 user_id, action(confirmed 또는 NULL) 존재
- 확인율 계산: confirmed 비율을 구하고, 없는 경우 0 처리
✅ SQL 풀이
SELECT a.user_id
, ROUND(IFNULL(COUNT(CASE WHEN b.action = 'confirmed' THEN b.user_id END) / COUNT(b.user_id), 0), 2) AS confirmation_rate
FROM Signups a
LEFT JOIN Confirmations b
ON a.user_id = b.user_id
GROUP BY a.user_id
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode SQL50] - Subqueries 문제풀이 (0) | 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 |
[LeetCode] SQL50 - Select 문제풀이 (0) | 2025.02.12 |