0% completed
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
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
FirstAppointments
that 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_id
and calculates the minimumbooking_date
, representing the first appointment date.
- Selects each
GROUP BY patient_id
:- Groups the records by
patient_id
to 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
FirstAppointments
CTE with theAppointments
table 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
FirstAppointments
CTE.
- Counts the total number of first appointments recorded in the
FROM FirstAppointments
:- Specifies the
FirstAppointments
CTE 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 | +----------------------+
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible