按另一列对差异分组求和
Sum the differences group by another colomn
我有一个 table 不同州的车辆行驶里程。
Table: VehicleState
VehicleID Mileage State DateTime
1 3000 TX 2016-09-20 03:00:00
1 3100 TX 2016-09-20 04:00:00
1 3200 OK 2016-09-20 05:00:00
1 3300 OK 2016-09-20 06:00:00
1 3400 OK 2016-09-20 07:00:00
1 3500 TX 2016-09-20 08:00:00
1 3600 TX 2016-09-20 09:00:00
1 3700 TX 2016-09-20 10:00:00
1 3800 TX 2016-09-20 11:00:00
我想获取该车辆在每个州的行驶里程。例如:
VehicleID Total_Mileage State Date
1 400 TX 2016-09-20
1 200 OK 2016-09-20
前两行表示车辆至少行驶了 100 英里。第三条记录是 3200,但此时,我不知道车辆在 TX 或 OK 的时间从凌晨 4 点到凌晨 5 点之间有多少英里,我想忽略 3100 和 3200 之间的差异。TX 的总里程将是 100(前两行)+ 300(后四行),这给了我 400.
我目前正在使用一个巨大的带有游标的存储过程来计算。我想知道是否有更简单的方法来做到这一点。提前谢谢你。
按照 OP 评论,它看起来像 row_number() 和内部连接。日期不参与分组。
declare @t table (
VehicleID int,
Mileage int,
State char(2),
dt DateTime);
insert @t(VehicleID, Mileage, State, Dt)
values
(1,3000,'TX','2016-09-20 03:00:00')
,(1,3100,'TX','2016-09-20 04:00:00')
,(1,3200,'OK','2016-09-20 05:00:00')
,(1,3300,'OK','2016-09-20 06:00:00')
,(1,3400,'OK','2016-09-20 07:00:00')
,(1,3500,'TX','2016-09-20 08:00:00')
,(1,3600,'TX','2016-09-20 09:00:00')
,(1,3700,'TX','2016-09-20 10:00:00')
,(1,3800,'TX','2016-09-20 11:00:00');
with nmb as(
select VehicleID, Mileage, State, rn=row_number() over(partition by VehicleID order by dt)
from @t
)
select t1.VehicleID, t1.State, sum(t2.Mileage - t1.Mileage)
from nmb t1
join nmb t2 on t1.VehicleID = t2.VehicleID and t1.State = t2.State and t1.rn = t2.rn-1
group by t1.VehicleID, t1.State;
我有一个 table 不同州的车辆行驶里程。
Table: VehicleState
VehicleID Mileage State DateTime
1 3000 TX 2016-09-20 03:00:00
1 3100 TX 2016-09-20 04:00:00
1 3200 OK 2016-09-20 05:00:00
1 3300 OK 2016-09-20 06:00:00
1 3400 OK 2016-09-20 07:00:00
1 3500 TX 2016-09-20 08:00:00
1 3600 TX 2016-09-20 09:00:00
1 3700 TX 2016-09-20 10:00:00
1 3800 TX 2016-09-20 11:00:00
我想获取该车辆在每个州的行驶里程。例如:
VehicleID Total_Mileage State Date
1 400 TX 2016-09-20
1 200 OK 2016-09-20
前两行表示车辆至少行驶了 100 英里。第三条记录是 3200,但此时,我不知道车辆在 TX 或 OK 的时间从凌晨 4 点到凌晨 5 点之间有多少英里,我想忽略 3100 和 3200 之间的差异。TX 的总里程将是 100(前两行)+ 300(后四行),这给了我 400.
我目前正在使用一个巨大的带有游标的存储过程来计算。我想知道是否有更简单的方法来做到这一点。提前谢谢你。
按照 OP 评论,它看起来像 row_number() 和内部连接。日期不参与分组。
declare @t table (
VehicleID int,
Mileage int,
State char(2),
dt DateTime);
insert @t(VehicleID, Mileage, State, Dt)
values
(1,3000,'TX','2016-09-20 03:00:00')
,(1,3100,'TX','2016-09-20 04:00:00')
,(1,3200,'OK','2016-09-20 05:00:00')
,(1,3300,'OK','2016-09-20 06:00:00')
,(1,3400,'OK','2016-09-20 07:00:00')
,(1,3500,'TX','2016-09-20 08:00:00')
,(1,3600,'TX','2016-09-20 09:00:00')
,(1,3700,'TX','2016-09-20 10:00:00')
,(1,3800,'TX','2016-09-20 11:00:00');
with nmb as(
select VehicleID, Mileage, State, rn=row_number() over(partition by VehicleID order by dt)
from @t
)
select t1.VehicleID, t1.State, sum(t2.Mileage - t1.Mileage)
from nmb t1
join nmb t2 on t1.VehicleID = t2.VehicleID and t1.State = t2.State and t1.rn = t2.rn-1
group by t1.VehicleID, t1.State;