728x90
📚문제
📝풀이
SELECT person_name
FROM Queue
WHERE turn = (SELECT MAX(turn) AS turn
FROM (SELECT q1.turn
, SUM(q2.weight) AS total_weight
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000);
문제를 보니 SQL 첫걸음 교재 공부하면서 봤었던
SET 변수명 ; 을 이용하여
total_weight 변수를 설정하여 weight을 더해나가는 방법을 생각했는데
LeetCode에서는 계속 에러가 발생한다 🤔
(나머지 부분은 잘 되는데 변수명 선언 하는 부분이 추가되면 에러가 발생)
그래서 Discussion의 타 MySQL 풀이를 참고하며
조금씩 단계별로 이해하면서 풀어보았다
1. Self JOIN
SELECT *
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
ORDER BY q1.turn;
왼쪽테이블(q1)의 turn으로 그룹화하면
오른쪽테이블은 q1의 turn에 대해
작거나 같은 turn들이 정렬 된다
2. SUM(q2.weight)
SELECT q1.turn
, SUM(q2.weight) AS total_weight
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
ORDER BY q1.turn;
q1.turn으로 그룹화 된 상태에서
q2.weight의 SUM을 구하면
해당 Turn까지의 총 무게합이 나온다
(1명탔을땐 총 250kg , 2명탔을 땐 총 600kg, ...)
3. HAVING(total_weight) <=1000
SELECT q1.turn
, SUM(q2.weight) AS total_weight
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn;
여러명이 탔을 때의 총 무게가 100kg이하여야 하므로
HAVING 조건으로 1000kg 까지의 행만 구하기
4. FROM절 서브쿼리
SELECT MAX(turn) AS turn
FROM (SELECT q1.turn
, SUM(q2.weight) AS total_weight
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000;
1000kg이하가 됐을 때의 Turn 수(몇번탔는지)를 알고 싶으므로 MAX(turn) 구하기
5. WHERE절 서브쿼리
SELECT person_name
FROM Queue
WHERE turn = (SELECT MAX(turn) AS turn
FROM (SELECT q1.turn
, SUM(q2.weight) AS total_weight
FROM Queue q1
INNER JOIN Queue q2 ON q1.turn >= q2.turn
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000);
1000kg가 됐을때의 turn수와 같은 turn수를 가질 때
누가 탔는지(person_name) 구하기
(SELECT MAX 값에서 스칼라 값을 가지므로 WHERE 조건 절에서 = 사용하기)
728x90