使用 MYSQL 计算同一列中许多日期与组之间的时间
calculating time between many dated in the same column with group by using MYSQL
我有一个数据集,其中包含客户编号和订单日期我需要做的是计算每个客户的每个订单之间的天数,例如:
所以我需要知道为每个客户下的每个订单之间的天数。感谢您的帮助:)
这是你将如何做到这一点,你可以使用 dense_rank()
MySQL 8.0
select t1.id, t1.order_date
, ifnull(
datediff(cast(t1.order_date as datetime), cast(t2.order_date as datetime))
,0) as intrval
from (
select dense_rank() over (partition by id order by cast(order_date as datetime) asc) as rnk
, order_date, id
from table1) as t1
left join
(
select dense_rank() over (partition by id order by cast(order_date as datetime) asc) as rnk
, order_date, id
from table1) as t2
on t1.id = t2.id and t2.rnk+1 = t1.rnk
输出:
你可以试试这个。
declare @tb table ( id int, order_date datetime)
insert into @tb ( id , order_date )
values ( 1, '2019-08-01' )
, ( 1, '2019-08-04' )
, ( 1, '2019-08-15' )
, ( 2, '2019-08-02' )
, ( 2, '2019-08-16' )
; with cte as (
select row_number() over (partition by id order by order_date) as Slno, Id, order_date from @tb)
select t.id, t.order_date , isnull( datediff(day, t1.order_date, t.order_date),0) as Diff
from cte as t left outer join cte as t1 on t.id=t1.id and t.slno=t1.slno+1
SQL 没有 window 函数:
select t1.id as ID, datediff(dd, convert(datetime, t1.order_date), convert(datetime, t2.order_date)) as DaysBetweenOrders
from orders t1
inner join orders t2 on t1.id = t2.id
where convert(datetime, t2.order_date) =
(select min(convert(datetime, t3.order_date))
from orders t3 where t3.id = t1.id
and convert(datetime, t3.order_date) > convert(datetime, t1.order_date))
使用一个简单的 window 函数!
select t.*,
datediff(order_date, lag(order_date) over (partition by id)) as diff
from t;
在 SQL 服务器中,这将是:
select t.*,
datediff(day, lag(order_date) over (partition by id), order_date) as diff
from t;
我有一个数据集,其中包含客户编号和订单日期我需要做的是计算每个客户的每个订单之间的天数,例如:
所以我需要知道为每个客户下的每个订单之间的天数。感谢您的帮助:)
这是你将如何做到这一点,你可以使用 dense_rank()
MySQL 8.0
select t1.id, t1.order_date
, ifnull(
datediff(cast(t1.order_date as datetime), cast(t2.order_date as datetime))
,0) as intrval
from (
select dense_rank() over (partition by id order by cast(order_date as datetime) asc) as rnk
, order_date, id
from table1) as t1
left join
(
select dense_rank() over (partition by id order by cast(order_date as datetime) asc) as rnk
, order_date, id
from table1) as t2
on t1.id = t2.id and t2.rnk+1 = t1.rnk
输出:
你可以试试这个。
declare @tb table ( id int, order_date datetime)
insert into @tb ( id , order_date )
values ( 1, '2019-08-01' )
, ( 1, '2019-08-04' )
, ( 1, '2019-08-15' )
, ( 2, '2019-08-02' )
, ( 2, '2019-08-16' )
; with cte as (
select row_number() over (partition by id order by order_date) as Slno, Id, order_date from @tb)
select t.id, t.order_date , isnull( datediff(day, t1.order_date, t.order_date),0) as Diff
from cte as t left outer join cte as t1 on t.id=t1.id and t.slno=t1.slno+1
SQL 没有 window 函数:
select t1.id as ID, datediff(dd, convert(datetime, t1.order_date), convert(datetime, t2.order_date)) as DaysBetweenOrders
from orders t1
inner join orders t2 on t1.id = t2.id
where convert(datetime, t2.order_date) =
(select min(convert(datetime, t3.order_date))
from orders t3 where t3.id = t1.id
and convert(datetime, t3.order_date) > convert(datetime, t1.order_date))
使用一个简单的 window 函数!
select t.*,
datediff(order_date, lag(order_date) over (partition by id)) as diff
from t;
在 SQL 服务器中,这将是:
select t.*,
datediff(day, lag(order_date) over (partition by id), order_date) as diff
from t;