如何在MySql中查找滚动日期差异?

问题描述

我有一个名为“订单”的表

订单:

orderid   userid   order_date
10         1001    2020-07-11
11         1001    2020-07-13  
12         1002    2020-07-15
13         1002    2020-07-17
14         1003    2020-07-20
15         1003    2020-07-24

我正在努力实现以下目标:

orderid   userid   order_date     date_differnce_between_orders
10         1001    2020-07-11             null
11         1001    2020-07-13             2
12         1002    2020-07-15             null
13         1002    2020-07-18             3
14         1003    2020-07-20             null
15         1003    2020-07-25             5

因此,基本上我想分别计算每个用户的日期差,以便进一步计算用户下订单的平均天数。

有人可以帮助“ date_differnce_between_orders”列吗?

解决方法

对于MySql 8.0+,您可以使用窗口函数LAG()

select *,datediff(
    order_date,lag(order_date) over (partition by userid order by order_date)
  ) date_differnce_between_orders 
from orders
order by orderid;

对于以前的版本,请使用相关的子查询来返回每个用户的先前订单的日期:

select o.*,datediff(
    o.order_date,(select max(order_date) from orders where userid = o.userid and order_date < o.order_date)
  ) date_differnce_between_orders 
from orders o
order by o.orderid;

请参见demo
结果:

> orderid | userid | order_date | date_differnce_between_orders
> ------: | -----: | :----------| ----------------------------:
>      10 |   1001 | 2020-07-11 |                          null
>      11 |   1001 | 2020-07-13 |                             2
>      12 |   1002 | 2020-07-15 |                          null
>      13 |   1002 | 2020-07-18 |                             3
>      14 |   1003 | 2020-07-20 |                          null
>      15 |   1003 | 2020-07-25 |                             5
,

尝试以下查询:

SELECT orderid,userid,order_date,(CASE 
    WHEN @lastuserid = userid 
    THEN DATEDIFF(order_date,@date) 
    ELSE NULL END
) AS date_differnce_between_orders,@lastuserid:=userid,@date:= (CASE WHEN @lastuserid = userid THEN order_date ELSE NULL END)
FROM orders,(SELECT @date:=0,@lastuserid:=0) AS x
ORDER BY userid,order_date