Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
9. Same-Day Appointment Fulfillment (Medium)
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

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

MYSQL
MYSQL

. . . .

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.
  • SELECT patient_id, MIN(booking_date) AS first_booking_date:
    • Selects each patient_id and calculates the minimum booking_date, representing the first appointment date.
  • GROUP BY patient_id:
    • Groups the records by patient_id to ensure the minimum booking date is calculated for each individual patient.

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 the Appointments table to access full appointment details for each patient's first appointment.
  • 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.
  • FROM FirstAppointments:
    • Specifies the FirstAppointments CTE as the data source.

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 | +----------------------+

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible