2016-09-20 4 views
-3

У меня есть стол для пробега автомобиля в разных штатах.Составьте группу различий другим colomn

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 между временем 4AM и 5AM, я хочу игнорировать разницу между 3100 и 3200. Общий пробег в TX будет 100 (первые два ряда) + 300 (последние четыре строки), что дает мне 400.

В настоящее время я использую огромную хранимую процедуру с курсорами для вычисления. Мне интересно, есть ли более простой способ сделать это. Заранее спасибо.

+1

Я не понимаю, как вы получаете эти значения для своих данных образца. Можете ли вы объяснить, как на самом деле рассчитать 'Total_Mileage'? – Lamak

+1

и как вы тоже обрабатываете дату. –

+0

Почему так, (3800-3000) <> (200 + 400)? – Serg

ответ

0

После комментариев к 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;