Leetcode - 1204. Last Person to Fit in the Elevator


Table: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+
person_id is the primary key column for this table.
This table has the information about all people waiting for an elevator.
The person_id and turn columns will contain all numbers from 1 to n, where n is the number of rows in the table.

 

The maximum weight the elevator can hold is 1000.

Write an SQL query to find the person_name of the last person who will fit in the elevator without exceeding the weight limit. It is guaranteed that the person who is first in the queue can fit in the elevator.

The query result format is in the following example:

Queue table
+-----------+-------------------+--------+------+
| person_id | person_name       | weight | turn |
+-----------+-------------------+--------+------+
| 5         | George Washington | 250    | 1    |
| 3         | John Adams        | 350    | 2    |
| 6         | Thomas Jefferson  | 400    | 3    |
| 2         | Will Johnliams    | 200    | 4    |
| 4         | Thomas Jefferson  | 175    | 5    |
| 1         | James Elephant    | 500    | 6    |
+-----------+-------------------+--------+------+

Result table
+-------------------+
| person_name       |
+-------------------+
| Thomas Jefferson  |
+-------------------+

Queue table is ordered by turn in the example for simplicity.
In the example George Washington(id 5), John Adams(id 3) and Thomas Jefferson(id 6) will enter the elevator as their weight sum is 250 + 350 + 400 = 1000.
Thomas Jefferson(id 6) is the last person to fit in the elevator because he has the last turn in these three people.


要知道哪一位最后fit elevator,则需要知道之前进去的人的体重总和,即每进去一个人计算电梯里人的体重总和。也就是说,Queue table需要添加一列weight_accumulate. 可以用self join turn来实现:

from Queue q1 inner join Queue q2 on q1.turn >= q2.turn

得到table如下:

weight1 turn1 weight2 turn2
250 1 250 1
350 2 250 1
350 2 350 2
400 3 250 1
400 3 350 2
400 3 400 3
200 4 250 1
200 4 350 2
200 4 400 3
200 4 200 4
175 5 250 1
175 5 350 2
175 5 400 3
175 5 200 4
175 5 175 5
500 6 250 1
500 6 350 2
500 6 400 3
500 6 200 4
500 6 175 5
500 6 500 6

 

group by q1.turn,算出q2.weight的总和即每进去一位的体重总和。

coding:

select q1.person_name as person_name
from Queue q1 inner join Queue q2
on q1.turn >= q2.turn
group by q1.turn
having sum(q2.weight) <= 1000
order by q1.turn desc
limit 1

你可能感兴趣的:(Leetcode - 1204. Last Person to Fit in the Elevator)