2016-09-20 8 views
-3

車の走行距離の表が異なる状態です。別のグループで合計を差し引く

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 

最初の2つの行は、車両のドライブが少なくとも100マイルを示しています。 3番目の記録は3200ですが、その時点では、午前4時から午前5時の間にTXまたはOKで車両が何マイル離れているかはわかりません。私は3100と3200の差を無視したいと思います。私は400を与える100(最初の2行)+ 300(最後の4行)である。私は現在、計算するためにカーソルを持つ巨大なストアドプロシージャを使用しています。私はこれを行う簡単な方法があるかどうか疑問に思っています。前もって感謝します。

+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; 
関連する問題