📖 문제
조건 : 버스 최대 탑승 무게 = 1000
무게를 초과하지 않고 버스에 탈 수 있는 마지막 사람의 이름 추출
1. turn 기준으로 weight 누적 합 구하기
2. 1000을 넘지 않는 마지막 사람 추출
🔗Link : https://leetcode.com/problems/last-person-to-fit-in-the-bus/?envType=study-plan-v2&envId=top-sql-50
👀 What I Learned
SQL로 누적합을 구하는 법을 몰라 어려웠던 문제.
구글링을 통해 SUM() 함수도 LEAD,LAG 처럼 SUM(EXP) OVER (PARTITION BY __ ORDER BY __) 이런 식으로 쓸 수 있다는 걸 알게 되었다 !
📖 풀이 과정
1. `SUM(weight) OVER (ORDER BY turn)` - turn 오름차순 순으로 누적합을 구한 후 Total_Weight 열로 추가
2. 누적합을 추가한 테이블을 FROM 절 서브쿼리로 넣은 후 누적합 1000 초과하지 않는 행만 추출
3. 가장 마지막에 탈 수 있는 사람 (누적합이 가장 1000에 가까운 사람)을 추출해야하므로 누적합 내림차순으로 정렬 & 가장 위 1명의 이름만 추출 (LIMIT 1)
SELECT person_name
FROM(
SELECT turn
, person_name
, SUM(weight) OVER (ORDER BY turn) as Total_Weight
FROM Queue
) as cum
WHERE Total_Weight <= 1000
ORDER BY Total_Weight DESC
LIMIT 1
'데이터 공부 > SQL' 카테고리의 다른 글
[초보자를 위한 BigQuery 입문] SQL 쿼리 잘 작성하기 (1) | 2025.01.21 |
---|---|
[프로그래머스] 조건에 맞는 사용자 정보 조회하기 CONCAT_WS (0) | 2024.10.14 |
[LeetCode] 550. Game Play Analysis IV (Where절 Subquery) (0) | 2024.08.13 |
[LeetCode] 1174. Immediate Food Delivery II (Where절 Subquery, 집계함수) (0) | 2024.08.12 |
[LeetCode] 1280. Students and Examinations (CROSS JOIN, LEFT JOIN) (0) | 2024.08.07 |