Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
8. Library Book Checkouts by Date (Easy)
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: Checkouts
This table logs each book checkout from a library, including the date of the checkout and the title of the book.

+----------------+-----------+
| Column Name    | Type      |
+----------------+-----------+
| checkout_date  | date      |
| book_title     | varchar   |
+----------------+-----------+
There is no primary key for this table, and it may contain duplicate rows.

Develop a solution to report the number of distinct book titles checked out and a lexicographically sorted list of these titles for each date.

Example

Input:

Checkouts table: +---------------+-----------------------+ | checkout_date | book_title | +---------------+-----------------------+ | 2020-07-01 | The Hobbit | | 2020-07-01 | 1984 | | 2020-07-02 | War and Peace | | 2020-07-01 | The Hobbit | | 2020-07-02 | Crime and Punishment | | 2020-07-03 | Brave New World | +---------------+-----------------------+

Output:

+---------------+---------------+----------------------------------+ | checkout_date | num_checkouts | book_titles | +---------------+---------------+----------------------------------+ | 2020-07-01 | 2 | 1984,The Hobbit | | 2020-07-02 | 2 | Crime and Punishment,War and Peace| | 2020-07-03 | 1 | Brave New World | +---------------+---------------+----------------------------------+

In this example, the report shows the number of distinct titles checked out on each date and the sorted list of these titles.

Try It Yourself

MYSQL
MYSQL

. . . .

Solution

To generate a report of distinct book titles checked out each day in a lexicographically sorted list, along with the number of distinct checkouts, we can utilize SQL's aggregation functions and window functions. The solution involves grouping the data by checkout dates, counting distinct book titles, and concatenating these titles in a sorted manner.

  • Group by Checkout Date: Aggregate data based on each checkout_date to analyze daily checkouts.
  • Count Distinct Book Titles: Determine the number of unique book titles checked out each day.
  • Concatenate Sorted Book Titles: Combine the distinct book titles into a comma-separated, lexicographically sorted string.
  • Order the Results: Present the final report ordered by checkout_date for clarity.

SQL Query

SELECT checkout_date, COUNT(DISTINCT book_title) AS num_checkouts, GROUP_CONCAT(DISTINCT book_title ORDER BY book_title ASC SEPARATOR ',') AS book_titles FROM Checkouts GROUP BY checkout_date ORDER BY checkout_date;

Step-by-Step Approach

Step 1: Group by Checkout Date and Count Distinct Book Titles

Aggregate the data by each checkout_date and count the number of unique book_titles checked out on that date.

SQL Query:

SELECT checkout_date, COUNT(DISTINCT book_title) AS num_checkouts FROM Checkouts GROUP BY checkout_date;

Explanation:

  • SELECT checkout_date, COUNT(DISTINCT book_title) AS num_checkouts:
    • Selects each checkout_date and counts the number of distinct book_titles associated with that date.
  • FROM Checkouts:
    • Specifies the Checkouts table as the data source.
  • GROUP BY checkout_date:
    • Groups the records by checkout_date to perform the aggregation per day.

Output After Step 1:

+---------------+--------------+ | checkout_date | num_checkouts| +---------------+--------------+ | 2020-07-01 | 2 | | 2020-07-02 | 2 | | 2020-07-03 | 1 | +---------------+--------------+

Step 2: Concatenate Sorted Distinct Book Titles

Objective:
For each checkout_date, create a comma-separated list of distinct book_titles, sorted lexicographically.

SQL Query:

SELECT checkout_date, GROUP_CONCAT(DISTINCT book_title ORDER BY book_title ASC SEPARATOR ',') AS book_titles FROM Checkouts GROUP BY checkout_date;

Explanation:

  • SELECT checkout_date, GROUP_CONCAT(DISTINCT book_title ORDER BY book_title ASC SEPARATOR ',') AS book_titles:
    • Selects each checkout_date and concatenates the distinct book_titles into a single string, ordered lexicographically and separated by commas.
  • FROM Checkouts:
    • Specifies the Checkouts table as the data source.
  • GROUP BY checkout_date:
    • Groups the records by checkout_date to perform the aggregation per day.

Output After Step 2:

+---------------+----------------------------------+ | checkout_date | book_titles | +---------------+----------------------------------+ | 2020-07-01 | 1984,The Hobbit | | 2020-07-02 | Crime and Punishment,War and Peace| | 2020-07-03 | Brave New World | +---------------+----------------------------------+

Step 3: Combine Count and Concatenation, and Order by Checkout Date

Merge the results of Steps 1 and 2 to include both the number of distinct checkouts and the sorted list of book titles for each checkout_date. Finally, order the results by checkout_date.

SQL Query:

SELECT checkout_date, COUNT(DISTINCT book_title) AS num_checkouts, GROUP_CONCAT(DISTINCT book_title ORDER BY book_title ASC SEPARATOR ',') AS book_titles FROM Checkouts GROUP BY checkout_date ORDER BY checkout_date;

Explanation:

  • SELECT checkout_date, COUNT(DISTINCT book_title) AS num_checkouts, GROUP_CONCAT(...) AS book_titles:
    • Combines the count of distinct book titles and the concatenated list of these titles for each checkout_date.
  • ORDER BY checkout_date:
    • Sorts the final output in ascending order based on checkout_date.

Final Output:

+---------------+--------------+----------------------------------+ | checkout_date | num_checkouts| book_titles | +---------------+--------------+----------------------------------+ | 2020-07-01 | 2 | 1984,The Hobbit | | 2020-07-02 | 2 | Crime and Punishment,War and Peace| | 2020-07-03 | 1 | Brave New World | +---------------+--------------+----------------------------------+

.....

.....

.....

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