Reputation: 123
I have a table named "orders"
Orders:
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
I'm trying to achieve the following:
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
So basically I want to calculate date difference for each user separately so that I could further calculate the average number of days a user takes to place an order.
Can somebody help with the "date_differnce_between_orders" column?
Upvotes: 1
Views: 936
Reputation: 2281
Try the below query:
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
Upvotes: 0
Reputation: 164064
For MySql 8.0+ you can use window function 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;
For previous versions use a correlated subquery that returns the date of the previous order of each user:
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;
See the demo.
Results:
> 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
Upvotes: 1