medium Same-Day Appointment Fulfillment
Problem Statement
Table: Appointments
This table holds information about medical appointments for patients. Each appointment includes an appointment ID, patient ID, the date the appointment was made, and the preferred appointment date specified by the patient.
+------------------------+---------+
| Column Name | Type |
+------------------------+---------+
| appointment_id | int |
| patient_id | int |
| booking_date | date |
| patient_pref_date | date |
+------------------------+---------+
appointment_id is the column of unique values for this table.
An appointment is considered immediate if the patient's preferred appointment date is the same as the booking date; otherwise, it is considered scheduled.
The first appointment of a patient is defined as the appointment with the earliest booking date made by that patient. It is assured that each patient has exactly one first appointment.
Develop a solution to find the percentage of immediate appointments among the first appointments of all patients, rounded to 2 decimal places.
Return the result in the format illustrated in the following example.
Example
Input:
Appointments table: +----------------+------------+-------------+------------------+ | appointment_id | patient_id | booking_date | patient_pref_date| +----------------+------------+-------------+------------------+ | 10 | 20 | 2020-07-01 | 2020-07-02 | | 11 | 30 | 2020-07-02 | 2020-07-02 | | 12 | 20 | 2020-07-15 | 2020-07-16 | | 13 | 40 | 2020-07-22 | 2020-07-22 | | 14 | 40 | 2020-07-18 | 2020-07-19 | | 15 | 30 | 2020-07-20 | 2020-07-22 | | 16 | 50 | 2020-07-25 | 2020-07-25 | +----------------+------------+-------------+------------------+
Output:
+----------------------+ | immediate_percentage | +----------------------+ | 50.00 | +----------------------+
Here, the first appointments of the patients having patient_id 30 and 50 have immediate appointments.
Try It Yourself
-- TODO: Write your user queries here
Solution
To determine the percentage of immediate appointments among the first appointments of all patients, we need to systematically identify each patient's earliest appointment and check if it was scheduled immediately. An appointment is considered immediate if the patient's preferred appointment date matches the booking date.
- Identify First Appointments: Determine the earliest booking date for each patient to identify their first appointment.
- Determine Immediate Appointments: Check if the first appointment's booking date matches the patient's preferred appointment date.
- Calculate Percentage: Compute the ratio of immediate first appointments to the total number of first appointments, and round it to two decimal places.
SQL Query
WITH FirstAppointments AS ( SELECT patient_id, MIN(booking_date) AS first_booking_date FROM Appointments GROUP BY patient_id ) SELECT ROUND( (SELECT COUNT(*) FROM FirstAppointments fa JOIN Appointments a ON fa.patient_id = a.patient_id AND fa.first_booking_date = a.booking_date WHERE a.booking_date = a.patient_pref_date) / (SELECT COUNT(*) FROM FirstAppointments) * 100, 2) AS immediate_percentage
Step-by-Step Approach
Step 1: Identify First Appointments
Determine the earliest booking date for each patient to identify their first appointment.
SQL Query:
WITH FirstAppointments AS ( SELECT patient_id, MIN(booking_date) AS first_booking_date FROM Appointments GROUP BY patient_id )
Explanation:
WITH FirstAppointments AS (...):- Creates a Common Table Expression (CTE) named
FirstAppointmentsthat stores each patient's earliest booking date.
- Creates a Common Table Expression (CTE) named
SELECT patient_id, MIN(booking_date) AS first_booking_date:- Selects each
patient_idand calculates the minimumbooking_date, representing the first appointment date.
- Selects each
GROUP BY patient_id:- Groups the records by
patient_idto ensure the minimum booking date is calculated for each individual patient.
- Groups the records by
Output After Step 1:
Assuming the example input, the FirstAppointments CTE would produce:
+------------+---------------------+ | patient_id | first_booking_date | +------------+---------------------+ | 20 | 2020-07-01 | | 30 | 2020-07-02 | | 40 | 2020-07-18 | | 50 | 2020-07-25 | +------------+---------------------+
Step 2: Determine Immediate Appointments
Identify which of the first appointments are immediate by checking if the booking date matches the patient's preferred appointment date.
SQL Query:
SELECT COUNT(*) FROM FirstAppointments fa JOIN Appointments a ON fa.patient_id = a.patient_id AND fa.first_booking_date = a.booking_date WHERE a.booking_date = a.patient_pref_date
Explanation:
SELECT COUNT(*):- Counts the number of records that meet the immediate appointment criteria.
FROM FirstAppointments fa JOIN Appointments a ON ...:- Joins the
FirstAppointmentsCTE with theAppointmentstable to access full appointment details for each patient's first appointment.
- Joins the
fa.patient_id = a.patient_id AND fa.first_booking_date = a.booking_date:- Ensures that the joined records correspond to the first appointment of each patient.
WHERE a.booking_date = a.patient_pref_date:- Filters the records to include only those where the booking date matches the patient's preferred appointment date, indicating an immediate appointment.
Output After Step 2:
Based on the example input, the query would return:
+----------+ | COUNT(*) | +----------+ | 2 | +----------+
Step 3: Calculate Total Number of First Appointments
Determine the total number of first appointments across all patients to serve as the denominator for the percentage calculation.
SQL Query:
SELECT COUNT(*) FROM FirstAppointments
Explanation:
SELECT COUNT(*):- Counts the total number of first appointments recorded in the
FirstAppointmentsCTE.
- Counts the total number of first appointments recorded in the
FROM FirstAppointments:- Specifies the
FirstAppointmentsCTE as the data source.
- Specifies the
Output After Step 3:
Based on the example input, the query would return:
+----------+ | COUNT(*) | +----------+ | 4 | +----------+
Step 4: Calculate and Select the Immediate Percentage
Compute the percentage of immediate first appointments by dividing the number of immediate appointments by the total number of first appointments and rounding the result to two decimal places.
SQL Query:
SELECT ROUND( (SELECT COUNT(*) FROM FirstAppointments fa JOIN Appointments a ON fa.patient_id = a.patient_id AND fa.first_booking_date = a.booking_date WHERE a.booking_date = a.patient_pref_date) / (SELECT COUNT(*) FROM FirstAppointments) * 100, 2) AS immediate_percentage
Explanation:
SELECT ROUND(..., 2) AS immediate_percentage:-
Calculates the percentage and rounds it to two decimal places, labeling the result as
immediate_percentage.
-
* 100:- Converts the ratio to a percentage.
ROUND(..., 2):- Rounds the percentage to two decimal places for precision.
Final Output:
+----------------------+ | immediate_percentage | +----------------------+ | 50.00 | +----------------------+
🤖 Don't fully get this? Learn it with Claude
Stuck on Same-Day Appointment Fulfillment? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Same-Day Appointment Fulfillment** (Databases). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Same-Day Appointment Fulfillment** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Same-Day Appointment Fulfillment**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Same-Day Appointment Fulfillment**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.