如何找到 MySql 中的滚动日期差异?

How to find Rolling Date difference in MySql?

我有一个 table 名为“订单”

订单:

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”栏吗?

试试下面的查询:

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

对于 MySql 8.0+,您可以使用 window 函数 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;

对于以前的版本,使用相关子查询 returns 每个用户之前订单的日期:

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