Knowledge Guide
HomeDatabasesSQL Practice Problems

Status of Flight Tickets

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

Image
Image

Output

Image
Image

Try It Yourself

java
-- TODO: Write your user queries here

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

  1. Combine Flight and Passenger Data:

    • Merge data from Flights and Passengers tables to associate passengers with flight capacities.
  2. Rank Passengers per Flight by Booking Time:

    • Assign a rank to each passenger within their respective flights based on their booking times.
  3. Determine Ticket Status:

    • Compare each passenger's rank with the flight's capacity to assign 'Confirmed' or 'Waitlist' status.
  4. Present the Final Results:

    • Display each passenger's ID alongside their ticket status, ordered by passenger_id in ascending order.

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:

  1. Passengers LEFT JOIN Flights USING(flight_id)
    • Performs a left join between the Passengers table and the Flights table based on the common column flight_id.
    • LEFT JOIN ensures that all records from Passengers are retained, even if there is no matching flight_id in Flights. However, since every flight_id in Passengers should correspond to a valid flight_id in Flights, 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.

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:

  1. 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 same flight_id. This ensures that ranking is performed separately for each flight.
    • ORDER BY booking_time: Orders the rows within each partition by booking_time in ascending order. Passengers who booked earlier receive a higher priority (lower rank number).
  2. IF(Rank() OVER (...) <= capacity, 'Confirmed', 'Waitlist') AS Status
    • IF(condition, value_if_true, value_if_false): A conditional function that returns value_if_true if the condition is true, else returns value_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 as Status.

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:

  1. ORDER BY passenger_id;
    • Orders the final result set by passenger_id in ascending order to meet the problem's requirement.

Final Output:

+--------------+-----------+ | passenger_id | Status | +--------------+-----------+ | 101 | Confirmed | | 102 | Waitlist | | 103 | Confirmed | | 104 | Confirmed | | 105 | Confirmed | | 106 | Waitlist | | 107 | Confirmed | +--------------+-----------+
🤖 Don't fully get this? Learn it with Claude

Stuck on Status of Flight Tickets? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🎨 Explain it visually

Build the mental picture, not memorization.

I just read a lesson on **Status of Flight Tickets** (Databases) and want to truly understand it. Explain Status of Flight Tickets from first principles using ONE vivid real-world analogy and a visual mental model — draw it as ASCII art or a clear step-by-step diagram — with a concrete example using real numbers. Then ask me one question to check I got the mental picture, and wait for my reply. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🤔 Walk me through it (interactive)

Socratic — adapts to where you're stuck.

Teach me **Status of Flight Tickets** interactively. Ask me ONE guiding question at a time, wait for my answer, and adapt to my confusion — build the idea with me step by step instead of explaining it all at once. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧪 Quiz me & fix my gaps

Active recall exposes what you missed.

Quiz me on **Status of Flight Tickets** with 5 questions, easy to tricky, ONE at a time. Tell me if each answer is right; at the end, explain clearly what I got wrong and why. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧠 Make it stick

Intuition + hook + flashcards for long-term memory.

Help me remember **Status of Flight Tickets** for the long term: give the one-sentence intuition, a memorable hook/mnemonic, a tiny worked example, and 3 active-recall flashcards (Q -> A). If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes