-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathLastPersonToFitInBus.sql
More file actions
79 lines (66 loc) · 2.79 KB
/
LastPersonToFitInBus.sql
File metadata and controls
79 lines (66 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
-- Table: Queue
-- +-------------+---------+
-- | Column Name | Type |
-- +-------------+---------+
-- | person_id | int |
-- | person_name | varchar |
-- | weight | int |
-- | turn | int |
-- +-------------+---------+
-- person_id column contains unique values.
-- This table has the information about all people waiting for a bus.
-- The person_id and turn columns will contain all numbers from 1 to n, where n is the number of rows in the table.
-- turn determines the order of which the people will board the bus, where turn=1 denotes the first person to
-- board and turn=n denotes the last person to board.
-- weight is the weight of the person in kilograms.
-- There is a queue of people waiting to board a bus. However, the bus has a weight limit of 1000 kilograms,
-- so there may be some people who cannot board.
-- Write a solution to find the person_name of the last person that can fit on the bus without exceeding the weight limit.
-- The test cases are generated such that the first person does not exceed the weight limit.
-- The result format is in the following example.
-- Example 1:
-- Input:
-- Queue table:
-- +-----------+-------------+--------+------+
-- | person_id | person_name | weight | turn |
-- +-----------+-------------+--------+------+
-- | 5 | Alice | 250 | 1 |
-- | 4 | Bob | 175 | 5 |
-- | 3 | Alex | 350 | 2 |
-- | 6 | John Cena | 400 | 3 |
-- | 1 | Winston | 500 | 6 |
-- | 2 | Marie | 200 | 4 |
-- +-----------+-------------+--------+------+
-- Output:
-- +-------------+
-- | person_name |
-- +-------------+
-- | John Cena |
-- +-------------+
-- Explanation: The folowing table is ordered by the turn for simplicity.
-- +------+----+-----------+--------+--------------+
-- | Turn | ID | Name | Weight | Total Weight |
-- +------+----+-----------+--------+--------------+
-- | 1 | 5 | Alice | 250 | 250 |
-- | 2 | 3 | Alex | 350 | 600 |
-- | 3 | 6 | John Cena | 400 | 1000 | (last person to board)
-- | 4 | 2 | Marie | 200 | 1200 | (cannot board)
-- | 5 | 4 | Bob | 175 | ___ |
-- | 6 | 1 | Winston | 500 | ___ |
-- +------+----+-----------+--------+--------------+
-- Write your PostgreSQL query statement below
-- Solution
with computed_cumulative_weight as
(
select * from
(
select person_id,
person_name,
turn,
sum(weight) over (order by turn asc) as cumulative_weight
from Queue
) where cumulative_weight <= 1000
)
select person_name
from computed_cumulative_weight
where cumulative_weight = (select max(cumulative_weight) from computed_cumulative_weight);