查找今天可能要订购的客户

  • 本文关键字:客户 今天 查找 mysql
  • 更新时间 :
  • 英文 :


我有样本数据:

CREATE TABLE Orders(customerid int, orderdate datetime, orderqty int);
INSERT into Orders(customerid, orderdate, orderqty) VALUES
(1,'2020-11-25',100),(1,'2020-11-27',160),(2,'2020-12-05',3490),
(1,'2020-11-29',293),(2,'2020-12-07',293),(1,'2020-12-01',382);

sqlfiddle:http://sqlfiddle.com/#!9/d90aaf/1/0

我想从这些数据中筛选出今天(或日历上的任何给定日期(。用户可能会订购。根据这些数据,每2天重复订购一次的customerid=1可能会在2020-12-03再次订购。理想情况下,我只希望每个客户的最后3个订单都能做到这一点。2020-12-03:的输出如下

customerid,last_orderdate,likelytoorder,sum_of_last_3_orderqty
1,2020-12-01,Yes,835

这里的另一位用户提供了这个答案:

(SELECT o2.*,MAX(ooo.orderdate) AS Latest3 FROM
(SELECT o1.*,MAX(oo.orderdate) AS Latest2 FROM 
(SELECT customerid,MAX(orderdate) AS Latest1 FROM Orders GROUP BY customerid) o1 
JOIN Orders oo ON o1.customerid=oo.customerid AND oo.orderdate<o1.Latest1 GROUP BY o1.customerid) o2
LEFT JOIN Orders ooo ON o2.customerid=ooo.customerid AND ooo.orderdate<o2.Latest2 GROUP BY o2.customerid) o3
JOIN orders oQ ON o3.customerid=oQ.customerid AND oQ.orderdate>=COALESCE(o3.Latest3,o3.Latest2,o3.Latest1)
GROUP BY o3.customerid

我试过了。

AND DATE(Latest1 + DATEDIFF(Latest1,IFNULL(Latest3,Latest2))/IF(Latest3 IS NULL,1,2)) = CURDATE()

但没有产出。我不知道如何从datediff添加到日期并将其与当前日期进行比较。它的作用是按顺序给出平均天数差。如果有可能的话,用这个按日期过滤。只显示可能在某个日期订购的客户。

我使用Latest1并将datediff添加在一起,以查找订单可能重复的日期

SELECT o3.customerid as "Customer",DATEDIFF(Latest1,IFNULL(Latest3,Latest2))/IF(Latest3 IS NULL,1,2) AS "Last 3 orders average day",SUM(oQ.orderqty) AS "Sum of order quantity for last 3 order", ADDDATE((Latest1),DATEDIFF(Latest1,IFNULL(Latest3,Latest2))/IF(Latest3 IS NULL,1,2)) as "Likely to order on" FROM
(SELECT o2.*,MAX(ooo.orderdate) AS Latest3 FROM
(SELECT o1.*,MAX(oo.orderdate) AS Latest2 FROM 
(SELECT customerid,MAX(orderdate) AS Latest1 FROM Orders
GROUP BY customerid) o1 
JOIN Orders oo ON o1.customerid=oo.customerid AND oo.orderdate<o1.Latest1
GROUP BY o1.customerid) o2
LEFT JOIN Orders ooo ON o2.customerid=ooo.customerid AND ooo.orderdate<o2.Latest2
GROUP BY o2.customerid) o3
JOIN orders oQ ON o3.customerid=oQ.customerid AND oQ.orderdate>=COALESCE(o3.Latest3,o3.Latest2,o3.Latest1)
GROUP BY o3.customerid

Sqlfiddle:http://sqlfiddle.com/#!9/26b8df/6/0

用";可能订购";日期我觉得没有必要写";是/否";列,因为它没有用处。

最新更新