2016-09-20 2 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 

첫 번째 두 행은 Vehicle Drives가 최소 100 마일을 표시합니다. 세 번째 기록은 3200이지만, 그 시점에서, 나는 차량이 TX에서 얼마나 많은 마일인지 알 수 없다. 오전 4시에서 5시 사이에 나는 3100과 3200 사이의 차이를 무시하고 싶다. TX의 총 주행 거리는 내게 400을주는 100 (처음 두 줄) + 300 (마지막 네 줄).

커서를 사용하여 계산할 수있는 거대한 저장 프로 시저를 사용하고 있습니다. 이 작업을 수행하는 더 쉬운 방법이 있는지 궁금합니다. 미리 감사드립니다.

+1

샘플 데이터에 대한 값을 얻는 방법을 모르겠다. 'Total_Mileage'를 실제로 계산하는 방법을 설명해 주시겠습니까? – Lamak

+1

그리고 날짜 처리 방법도 있습니다. –

+0

왜 그렇습니까? (3800-3000) <> (200 + 400)? – Serg

답변

0

OP 주석 다음에 row_number()와 inner join처럼 보입니다. Date는 그룹화에 아무런 영향을주지 않습니다.

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;