【问题标题】:Find which customers are likely to order today找出今天可能订购的客户
【发布时间】:2020-12-02 18:07:08
【问题描述】:

我有样本数据:

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 添加日期并将其与当前日期进行比较。 它的作用是按顺序给出平均天数差异。如果可以使用它按日期过滤它。仅显示可能在特定日期订购的客户。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我将 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

    带有“可能订购”日期。我认为没有必要写“是/否”列,因为它没有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2011-05-02
      • 2015-05-02
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多