Question 69

Number of happy customers

Instructions:

  • Write a query to return the number of happy customers from May 24 (inclusive) to May 31 (inclusive).

Definition

  • Happy customer: customers who made at least 1 rental in each day of any 2 consecutive days.

Hint

  • For customer 1, you can create the following temporary table:
  • customer 1, first rental date, second rental date
  • customer 1, second rental date, third rental date
  • ..............
  • customer 1, second last rental date, last rental date
  • customer 1, last rental date, NULL
  • As long as there is at least one row, where the delta of the last 2 columns are not null, and less or equal than 1 day, this customer must be a happy customer.

Table: rental

   col_name   | col_type
--------------+--------------------------
 rental_id    | integer
 rental_ts    | timestamp with time zone
 inventory_id | integer
 customer_id  | smallint
 return_ts    | timestamp with time zone
 staff_id     | smallint

Sample results

count
-------
   123
(1 row)

Solution

postgres
WITH customer_rental_date AS (
	SELECT
            customer_id,
            DATE(rental_ts) AS rental_date
	FROM rental
	WHERE DATE(rental_ts) >= '2020-05-24'
	AND DATE(rental_ts) <= '2020-05-31'
	GROUP BY 
            customer_id, 
            DATE(rental_ts)
),

customer_rental_date_diff AS (
    SELECT 
        customer_id,
        rental_date AS current_rental_date,
        LAG( rental_date, 1) OVER(PARTITION BY customer_id ORDER BY rental_date) AS prev_rental_date
    FROM customer_rental_date
)

SELECT COUNT(*) FROM (
	SELECT 
		customer_id, 
		MIN(current_rental_date - prev_rental_date) 	
	FROM customer_rental_date_diff
	GROUP BY customer_id
	HAVING MIN(current_rental_date - prev_rental_date) = 1
) X
;

Explanation

This query retrieves the count of customers who rented a movie within a consecutive day period during the last week of May 2020.

The query does this by first creating a common table expression (CTE) called customer_rental_date. This CTE filters the rental table to only include rentals that occurred between May 24th and May 31st, 2020. It then groups the rentals by customer and rental date.

The second CTE called customer_rental_date_diff calculates the time difference between the current rental date and the previous rental date for each customer.

The final SELECT statement selects the count of customers who have rented movies on consecutive days. It does this by first selecting the customer ID and the minimum time difference between the current rental date and the previous rental date for each customer. It then groups the results by customer ID and filters the results to only include customers whose minimum time difference is equal to 1 day.

Copied

Last Submission

postgres

No submission yet for this engine. Run and submit your query to save it here.

Copied
Expected results

Submit a query to compare against expected output.