2015-03-25 3 views
0

У меня есть выбор запроса, который получает CarID, месяц, пробег и выброс CO2. Теперь он дает за каждый месяц на автомобиль пробег, как это:Значение поля SELECT минус предыдущее значение поля

month 1: 5000 
month 2: 5200 
... 

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

pre timeframe: 5000 
month 1:  200 
month 2:  150 
... 

Как бы это сделать?

изменить: код, я еще не пробовал ничего, поскольку у меня нет понятия, как начать делать это.

resultlist as (
SELECT 
    CarID 
, '01/01/2000' as beginmonth 
, MAX(kilometerstand) as Kilometers 
, MAX(Co2Emission) as CO2 
FROM 
    totalmileagelist 
GROUP BY CarID 

UNION 

SELECT 
    CarID 
, beginmonth 
, MAX(kilometerstand) as Kilometers 
, MAX(Co2Emission) as CO2 
FROM 
resultunionlist 
GROUP BY CarID, beginmonth 
) 

select * from resultlist 
order by CarID, beginmonth 

Edit2: объяснение кода

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

+1

доля вашей схемы таблицы и запроса вы пытались –

+0

Добавлен его. Я еще не пробовал запрос, так как я не знаю, с чего начать. – Robin

ответ

0

Если вы просто хотите, чтобы вычесть предыдущий пробег, используйте lag() функцию:

select ml.*, 
     (kilometerstand - lag(kilometerstand) over (partition by carid order by month) 
     ) as diff 
from totalmileagelist ml; 

lag() доступен в SQL Server 2012+. В более ранних версиях вы можете использовать коррелированный подзапрос или outer apply.

(я пропустил версию, потому что в названии, а не на теге.) В SQL Server 2008:

select ml.*, 
     (ml.mileage - mlprev.mileage) as diff 
from totalmileagelist ml outer apply 
    (select top 1 ml2.* 
     from totalmileagelist ml2 
     where ml2.CarId = ml.CarId and 
      ml2.month < ml.month 
     order by ml2.month desc 
    ) mlprev; 
+0

Я использую SQL Server 2008, я взгляну на внешнее применение. Спасибо – Robin

+0

Это сработало, спасибо вам большое! – Robin

0

Попробуйте так:

SELECT id, yourColumnValue, 
     COALESCE(
     (
     SELECT TOP 1 yourColumnValue 
     FROM table_name t 
     WHERE t.id> tbl.id 
     ORDER BY 
      rowInt 
     ), 0) - yourColumnValue AS diff 
FROM table_name tbl 
ORDER BY 
     id 

или как это с помощью rank()

select rank() OVER (ORDER BY id) as 'RowId', mileage into temptable 
from totalmileagelist 

select t1.mileage - t2.mileage from temptable t1, temptable t2 
where t1.RowId = t2.RowId - 1 

drop table temptable 
+0

Я посмотрю на это, спасибо. – Robin

+0

@Robin: - Добро пожаловать –