如何找到 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
我有一个 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