/* table returned */
CREATE TABLE returned (
id int auto_increment primary key,
customerID VARCHAR(255),
returned_date DATE
);
INSERT INTO returned
(customerID, returned_date
)
VALUES
("Customer_01", "2020-03-20"),
("Customer_01", "2020-03-22"),
("Customer_01", "2020-04-19"),
("Customer_02", "2020-08-09"),
("Customer_03", "2020-07-31"),
("Customer_03", "2020-08-25"),
("Customer_04", "2020-09-16"),
("Customer_04", "2021-09-25");
/* table customers */
CREATE TABLE customers (
id int auto_increment primary key,
customerID VARCHAR(255),
first_order DATE
);
INSERT INTO customers
(customerID, first_order
)
VALUES
("Customer_01", "2020-03-15"),
("Customer_02", "2020-06-16"),
("Customer_03", "2020-07-27"),
("Customer_04", "2020-08-10");
Expected Result
customerID returned_date first_order COUNT
Customer_01 2020-03-20 2020-03-15 1
Customer_01 2020-03-22 2020-03-15 0
Customer_01 2020-04-19 2020-03-15 0
Customer_02 2020-08-09 2020-06-16 0
Customer_03 2020-07-31 2020-07-27 1
Customer_03 2020-08-25 2020-07-27 0
Customer_04 2020-09-16 2020-08-10 0
My database consists of two tables returned
and customers
.
In the customers
table you can find the date of the first_order
per customer.
In the returned
table you can find each return a customer has done so far.
Now, I want to create a list and count
all returned_dates
which are in the same month as the first_order
date of a certain customer.
If there are multiple orders in the same month then only the first match should be counted 1
.
The others should be 0
. (see Customer_01 in the example)
The difference to this question is that there is no return_date
that matches exactly with a first_order
date.
Therefore, this query does not work:
SELECT
r.customerID,
r.returned_date,
c.first_order,
(r.returned_date = c.first_order) is_first_order
FROM returned r
INNER JOIN customers c ON c.customerID = r.customerID
Do you have any idea how I can achieve the expected result?
Advertisement
Answer
You seem to want:
select r.customerID, r.returned_date, c.first_order,
(case when r.returned_date < c.first_order + interval 1 month and
row_number() over (partition by c.customerID order by returned_date) = 1
then 1 else 0
end) as return_flag
from returned r join
customers c
on c.customerID = r.customerID;
This flags the first return as “1” only if it is the first order and occurs within a month of the start date for the customer.