问题描述
/* 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"),"2020-04-19"),("Customer_02","2020-08-09"),("Customer_03","2020-07-31"),"2020-08-25"),("Customer_04","2020-09-16"),"2021-09-25");
/* table customers */
CREATE TABLE customers (
id int auto_increment primary key,first_order DATE
);
INSERT INTO customers
(customerID,first_order
)
VALUES
("Customer_01","2020-03-15"),"2020-06-16"),"2020-07-27"),"2020-08-10");
预期结果
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
我的数据库由两个表returned
和customers
组成。
在customers
表中,您可以找到每个客户first_order
的日期。
在returned
表中,您可以找到客户到目前为止已完成的每笔退货。
现在,我想创建一个列表,并将count
的所有returned_dates
与某个客户的first_order
日期相距同一个月。
如果在同一个月中有多个订单,则仅应将第一个匹配项计为1
。
其他应为0
。 (请参见示例中的Customer_01)
与this question的区别在于,没有return_date
与first_order
日期完全匹配。
因此,此查询不起作用:
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
您知道我如何达到预期的结果吗?
解决方法
您似乎想要:
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;
仅当这是第一笔订单并且在客户开始日期的一个月内发生时,这会将第一笔退货标记为“ 1”。