按另一列对差异分组求和

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;