Write SQL for library analytics
Company: Meta
Role: Data Engineer
Category: Data Manipulation (SQL/Python)
Difficulty: medium
Interview Round: Technical Screen
Overview: This question evaluates proficiency in SQL-based data manipulation and analytical querying, focusing on relational schema navigation, joins, aggregation, filtering, and handling temporal and conditional metrics within a library dataset.
Count active (not returned) loans for books in good condition
Tables
books(book_id INT, title VARCHAR(200), total_copies INT, condition VARCHAR(20))
members(member_id INT, member_name VARCHAR(100), referrer_member_id INT)
loans(loan_id INT, book_id INT, member_id INT, checkout_date DATE, due_date DATE, return_date DATE, renew_count INT)
reservations(reservation_id INT, member_id INT, book_id INT, reservation_date DATE)
Hints
- A loan is active if return_date is NULL.
- Join loans to books and filter condition = 'Good'.
Percentage of active good-condition loans renewed more than 2 times
Tables
books(book_id INT, title VARCHAR(200), total_copies INT, condition VARCHAR(20))
members(member_id INT, member_name VARCHAR(100), referrer_member_id INT)
loans(loan_id INT, book_id INT, member_id INT, checkout_date DATE, due_date DATE, return_date DATE, renew_count INT)
reservations(reservation_id INT, member_id INT, book_id INT, reservation_date DATE)
Hints
- Use the same filter as Question 1 to define the denominator.
- Compute numerator with a CASE expression and divide by COUNT(*).
Top 3 books with >10 copies by total lending time
Tables
books(book_id INT, title VARCHAR(200), total_copies INT, condition VARCHAR(20))
members(member_id INT, member_name VARCHAR(100), referrer_member_id INT)
loans(loan_id INT, book_id INT, member_id INT, checkout_date DATE, due_date DATE, return_date DATE, renew_count INT)
reservations(reservation_id INT, member_id INT, book_id INT, reservation_date DATE)
Hints
- Use COALESCE to treat unreturned loans as ending on 2025-06-01.
- Aggregate lending time per book and then ORDER BY the sum.
Member–referrer pair with the largest reservation-count difference
Tables
books(book_id INT, title VARCHAR(200), total_copies INT, condition VARCHAR(20))
members(member_id INT, member_name VARCHAR(100), referrer_member_id INT)
loans(loan_id INT, book_id INT, member_id INT, checkout_date DATE, due_date DATE, return_date DATE, renew_count INT)
reservations(reservation_id INT, member_id INT, book_id INT, reservation_date DATE)
Hints
- Pre-aggregate reservation counts per member with a LEFT JOIN so members with 0 reservations still appear.
- Join each member to their referrer and take ABS of the two counts.