0% completed
Problem
Table: Flights
+-------------+------+
| Column Name | Type |
+-------------+------+
| flight_id | int |
| capacity | int |
+-------------+------+
flight_id column contains distinct values.
Each row of this table contains flight id and capacity.
Table: Passengers
+--------------+----------+
| Column Name | Type |
+--------------+----------+
| passenger_id | int |
| flight_id | int |
| booking_time | datetime |
+--------------+----------+
passenger_id column contains distinct values.
booking_time column contains distinct values.
Each row of this table contains passenger id, booking time, and their flight id.
Problem Definition
Passengers book tickets for flights in advance. If a passenger books a ticket for a flight and there are still empty seats available on the flight, the passenger's ticket will be confirmed. However, the passenger will be on a waitlist if the flight is already at full capacity.
Write a solution to determine the current status of flight tickets for each passenger.
Return the result table ordered by passenger_id
in ascending order.
Example
Output
Try It Yourself
Solution
To determine the current status of flight tickets for each passenger—whether their booking is Confirmed or on the Waitlist—we analyze the Flights
and Passengers
tables. We ca efficiently accomplishes this by utilizing window functions and conditional logic to rank passengers based on their booking times relative to flight capacities. Below is a comprehensive breakdown of the approach, step-by-step execution, and detailed explanations for each line of the SQL query.
Approach Overview
-
Combine Flight and Passenger Data:
- Merge data from
Flights
andPassengers
tables to associate passengers with flight capacities.
- Merge data from
-
Rank Passengers per Flight by Booking Time:
- Assign a rank to each passenger within their respective flights based on their booking times.
-
Determine Ticket Status:
- Compare each passenger's rank with the flight's capacity to assign 'Confirmed' or 'Waitlist' status.
-
Present the Final Results:
- Display each passenger's ID alongside their ticket status, ordered by
passenger_id
in ascending order.
- Display each passenger's ID alongside their ticket status, ordered by
SQL Query
SELECT passenger_id, IF(Rank() over( PARTITION BY flight_id ORDER BY booking_time) <= capacity, 'Confirmed', 'Waitlist') AS Status FROM Passengers LEFT JOIN Flights USING(flight_id) ORDER BY passenger_id;
Step-by-Step Approach
Step 1: Combine Flight and Passenger Data
Merge the Passengers
table with the Flights
table to associate each passenger with the capacity of their booked flight. This association is crucial for determining whether a passenger's booking is confirmed or placed on a waitlist based on the flight's capacity.
SQL Snippet:
FROM Passengers LEFT JOIN Flights USING(flight_id)
Explanation:
Passengers LEFT JOIN Flights USING(flight_id)
- Performs a left join between the
Passengers
table and theFlights
table based on the common columnflight_id
. LEFT JOIN
ensures that all records fromPassengers
are retained, even if there is no matchingflight_id
inFlights
. However, since everyflight_id
inPassengers
should correspond to a validflight_id
inFlights
, this ensures comprehensive data association.USING(flight_id)
simplifies the join condition by specifying the common column directly, eliminating the need to prefix columns with table aliases.
- Performs a left join between the
Intermediate Output After Step 1:
+--------------+-----------+---------------------+-----------+ | passenger_id | flight_id | booking_time | capacity | +--------------+-----------+---------------------+-----------+ | 101 | 1 | 2023-07-10 16:30:00 | 2 | | 102 | 1 | 2023-07-10 17:45:00 | 2 | | 103 | 1 | 2023-07-10 12:00:00 | 2 | | 104 | 2 | 2023-07-05 13:23:00 | 2 | | 105 | 2 | 2023-07-06 09:00:00 | 2 | | 106 | 3 | 2023-07-08 11:10:00 | 1 | | 107 | 3 | 2023-07-08 09:10:00 | 1 | +--------------+-----------+---------------------+-----------+
Step 2: Rank Passengers per Flight by Booking Time and Assign Ticket Status
Assign a rank to each passenger within their respective flights based on their booking_time
. Passengers who book earlier receive a higher priority (lower rank number), while those who book later are ranked lower. This ranking is essential to determine which passengers secure a confirmed seat based on flight capacity.
SQL Snippet:
IF(Rank() over( PARTITION BY flight_id ORDER BY booking_time) <= capacity, 'Confirmed', 'Waitlist') AS Status
Explanation:
Rank() OVER (PARTITION BY flight_id ORDER BY booking_time)
Rank()
: A window function that assigns a rank to each row within a partition.OVER
: Defines the window for the rank calculation.PARTITION BY flight_id
: Divides the dataset into partitions where each partition contains rows with the sameflight_id
. This ensures that ranking is performed separately for each flight.ORDER BY booking_time
: Orders the rows within each partition bybooking_time
in ascending order. Passengers who booked earlier receive a higher priority (lower rank number).
IF(Rank() OVER (...) <= capacity, 'Confirmed', 'Waitlist') AS Status
IF(condition, value_if_true, value_if_false)
: A conditional function that returnsvalue_if_true
if thecondition
is true, else returnsvalue_if_false
.Rank() OVER (...) <= capacity
: Checks if the passenger's rank is within the flight's capacity.- If true: The passenger's booking is within the available capacity, hence 'Confirmed'.
- If false: The flight is already at full capacity, and the passenger is placed on the 'Waitlist'.
AS Status
: Aliases the resulting value asStatus
.
Intermediate Output After Step 2 (with Status):
+--------------+-----------+---------------------+-----------+-----------+ | passenger_id | flight_id | booking_time | capacity | Status | +--------------+-----------+---------------------+-----------+-----------+ | 101 | 1 | 2023-07-10 16:30:00 | 2 | Confirmed | | 102 | 1 | 2023-07-10 17:45:00 | 2 | Waitlist | | 103 | 1 | 2023-07-10 12:00:00 | 2 | Confirmed | | 104 | 2 | 2023-07-05 13:23:00 | 2 | Confirmed | | 105 | 2 | 2023-07-06 09:00:00 | 2 | Confirmed | | 106 | 3 | 2023-07-08 11:10:00 | 1 | Waitlist | | 107 | 3 | 2023-07-08 09:10:00 | 1 | Confirmed | +--------------+-----------+---------------------+-----------+-----------+
Step 3: Present the Final Results
Display each passenger's ID alongside their ticket status, ordered by passenger_id
in ascending order as specified.
SQL Snippet:
SELECT passenger_id, IF(Rank() over( PARTITION BY flight_id ORDER BY booking_time) <= capacity, 'Confirmed', 'Waitlist') AS Status FROM Passengers LEFT JOIN Flights USING(flight_id) ORDER BY passenger_id;
Explanation:
ORDER BY passenger_id;
- Orders the final result set by
passenger_id
in ascending order to meet the problem's requirement.
- Orders the final result set by
Final Output:
+--------------+-----------+ | passenger_id | Status | +--------------+-----------+ | 101 | Confirmed | | 102 | Waitlist | | 103 | Confirmed | | 104 | Confirmed | | 105 | Confirmed | | 106 | Waitlist | | 107 | Confirmed | +--------------+-----------+
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible