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
Database Exercise
Database Schema:
-- Database schema would be rendered hereExercise Script:
-- Exercise script would be rendered hereAvailable actions: Execute
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_percentageStep-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_dateExplanation:
-
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 FirstAppointmentsExplanation:
-
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_percentageExplanation:
-
SELECT ROUND(..., 2) AS immediate_percentage:- Calculates the percentage and rounds it to two decimal places, labeling the result as
immediate_percentage.
- Calculates the percentage and rounds it to two decimal places, labeling the result as
-
* 100:- Converts the ratio to a percentage.
-
ROUND(..., 2):- Rounds the percentage to two decimal places for precision.
Final Output:
+----------------------+
| immediate_percentage |
+----------------------+
| 50.00 |
+----------------------+