Knowledge Guide
HomeDatabasesSQL Practice Problems

medium Library Book Checkouts First Year

Problem Statement

Table: Checkouts

This table records the checkouts of books in a library. Each record includes a checkout ID, book ID, the year the book was checked out, the number of times it was checked out that year, and the price per checkout.

+----------------+-------+
| Column Name    | Type  |
+----------------+-------+
| checkout_id    | int   |
| book_id        | int   |
| year           | int   |
| checkouts      | int   |
| price          | int   |
+----------------+-------+
(checkout_id, year) is the primary key of this table.
book_id is a foreign key to the Books table.
Each row of this table shows a checkout record of the book book_id in a certain year.
Note that the price is per checkout.

Table: Books

This table lists all the books available in the library.

+------------+-----------+
| Column Name | Type     |
+------------+-----------+
| book_id     | int      |
| book_title  | varchar  |
+------------+-----------+
book_id is the primary key of this table.
Each row of this table indicates the title of each book.

Develop a solution to select the book id, the first year the book was checked out, the total number of checkouts, and the price for the first year of every book checked out.

Return the resulting table in any order.

Example

Input:

Checkouts table: +-------------+---------+-------+----------+-------+ | checkout_id | book_id | year | checkouts| price | +-------------+---------+-------+----------+-------+ | 1 | 100 | 2008 | 40 | 2 | | 2 | 100 | 2009 | 50 | 2 | | 3 | 200 | 2011 | 60 | 3 | +-------------+---------+-------+----------+-------+
Books table: +---------+-----------------+ | book_id | book_title | +---------+-----------------+ | 100 | War and Peace | | 200 | The Great Gatsby| | 300 | Moby Dick | +---------+-----------------+

Output:

+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+

Try It Yourself

java
-- TODO: Write your user queries here

Solution

To identify each book's first year of checkout, along with the total number of checkouts and the price per checkout for that year, we can follow a systematic approach using SQL's aggregation and join capabilities. This ensures accurate retrieval of the desired information by leveraging Common Table Expressions (CTEs) and appropriate filtering.

SQL Query

WITH FirstYear AS ( SELECT book_id, MIN(year) AS first_year FROM Checkouts GROUP BY book_id ) SELECT f.book_id, f.first_year, c.checkouts, c.price FROM FirstYear f JOIN Checkouts c ON f.book_id = c.book_id AND f.first_year = c.year ORDER BY book_id;

Step-by-Step Approach

Step 1: Determine the First Year of Checkout for Each Book

Identify the earliest year each book was checked out by finding the minimum year associated with each book_id.

SQL Query:

WITH FirstYear AS ( SELECT book_id, MIN(year) AS first_year FROM Checkouts GROUP BY book_id )

Explanation:

Output After Step 1:

+---------+------------+ | book_id | first_year | +---------+------------+ | 100 | 2008 | | 200 | 2011 | +---------+------------+

Step 2: Retrieve Checkout Details for the First Year

For each book, obtain the number of checkouts and the price per checkout corresponding to its first year of checkout.

SQL Query:

SELECT f.book_id, f.first_year, c.checkouts, c.price FROM FirstYear f JOIN Checkouts c ON f.book_id = c.book_id AND f.first_year = c.year

Explanation:

Output After Step 2:

+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+

Step 3: Order the Results by Book ID

Sort the final output in ascending order based on book_id to ensure organized presentation.

SQL Query:

ORDER BY book_id;

Explanation:

Final Output:

+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+
🤖 Don't fully get this? Learn it with Claude

Stuck on Library Book Checkouts First Year? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🪜 Hint ladder (no spoilers)

Progressively stronger hints — you still solve it.

I'm working on the problem **Library Book Checkouts First Year** (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.
🎨 Explain the approach visually

See the technique, not just code.

Explain the optimal approach to **Library Book Checkouts First Year** 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.
🔍 Review my solution

Catch bugs, edge cases, sub-optimality.

I'll paste my solution to **Library Book Checkouts First Year**. 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.
🔁 Drill the pattern

Lock in recognition with look-alikes.

Give me 2 problems that use the SAME underlying pattern as **Library Book Checkouts First Year**. 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.

📝 My notes