Problem Statement
Table: ElevatorQueue
This table stores information about individuals waiting for an elevator. Each row includes a person’s ID, their name, their weight, and their position in the queue.
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| person_id | int |
| name | varchar |
| weight | int |
| position | int |
+---------------+---------+
person_id column contains unique values.
This table contains data about all individuals queuing for an elevator.
The person_id and position columns will contain all numbers from 1 to n, where n is the number of rows in the table.
position determines the queue order for boarding the elevator, where position=1 denotes the first person in the queue and position=n denotes the last person in the queue.
weight is the weight of the individual in kilograms.The elevator has a maximum weight capacity of 800 kilograms. It’s possible that not everyone in the queue will be able to board the elevator without exceeding this limit.
Develop a solution to identify the name of the last individual who can board the elevator without surpassing the weight capacity. Assume that the first individual in the queue does not exceed the weight limit.
Return the result in the format provided in the example.
Example
Input:
ElevatorQueue table:
+-----------+------------+--------+----------+
| person_id | name | weight | position |
+-----------+------------+--------+----------+
| 1 | Alice | 200 | 1 |
| 2 | Bob | 150 | 4 |
| 3 | Charlie | 300 | 2 |
| 4 | Dave | 225 | 5 |
| 5 | Eve | 175 | 3 |
| 6 | Fiona | 350 | 6 |
+-----------+------------+--------+----------+Output:
+------+
| name |
+------+
| Eve |
+------+Try It Yourself
Database Exercise
Database Schema:
-- Database schema would be rendered hereExercise Script:
-- Exercise script would be rendered hereAvailable actions: Execute
Solution
To determine the last individual who can board the elevator without exceeding the 800-kilogram weight limit, we’ll follow a streamlined approach that aligns directly with the SQL query provided.
- Order Individuals by Position: Start by arranging the individuals based on their
positionin the queue to respect the boarding order. - Calculate Cumulative Weight: Compute a running total of weights as we move down the queue. This helps in identifying when the cumulative weight approaches or exceeds the elevator’s capacity.
- Identify the Last Eligible Individual: From the cumulative weights, select the last person whose addition doesn’t breach the 800-kilogram limit.
SQL Query
WITH CumulativeWeight AS (
SELECT name, weight, SUM(weight) OVER (ORDER BY position) AS total_weight
FROM ElevatorQueue
)
SELECT name
FROM CumulativeWeight
WHERE total_weight <= 800
ORDER BY total_weight DESC
LIMIT 1;Step-by-Step Approach
Step 1: Order by Position and Calculate Cumulative Weight
We utilize a Common Table Expression (CTE) named CumulativeWeight to:
- Order the individuals based on their
position. - Calculate the cumulative weight up to each person in the queue using the
SUM() OVER (ORDER BY position)window function.
WITH CumulativeWeight AS (
SELECT
name,
weight,
SUM(weight) OVER (ORDER BY position) AS total_weight
FROM
ElevatorQueue
)Explanation:
- The
SUM(weight) OVER (ORDER BY position)computes the running total of weights as per the queue order. - This CTE prepares the data for the next step by providing the cumulative weights alongside each individual’s name.
Step 2: Select the Last Individual Within Capacity
From the CumulativeWeight CTE, we:
- Filter individuals where the
total_weightis less than or equal to 800 kilograms. - Order the filtered results in descending order of
total_weightto prioritize the heaviest possible cumulative weight without exceeding the limit. - Limit the result to the top entry, which represents the last person who can board without surpassing the capacity.
SELECT
name
FROM
CumulativeWeight
WHERE
total_weight <= 800
ORDER BY
total_weight DESC
LIMIT 1;Explanation:
WHERE total_weight <= 800ensures we only consider scenarios where the elevator’s capacity isn’t exceeded.ORDER BY total_weight DESCarranges the eligible individuals so that the one with the highest cumulative weight is at the top.LIMIT 1retrieves the single name that fits the criteria, representing the last person who can board safely.
Final Output:
+------+
| name |
+------+
| Eve |
+------+