我有样本数据:
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
用";可能订购";日期我觉得没有必要写";是/否";列,因为它没有用处。