Sql 选择字段值减去上一个字段值

Sql 选择字段值减去上一个字段值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个select查询,它可以得到CarID、月份、里程和二氧化碳排放量。 现在每个月每辆车的里程如下: month 1: 5000 month 2: 5200 ... SELECT id, yourColumnValue, COALESCE( ( SELECT TOP 1 yourColumnValue FROM table_name t WHERE t.id> tbl.id ORDER BY

我有一个select查询,它可以得到CarID、月份、里程和二氧化碳排放量。 现在每个月每辆车的里程如下:

month 1: 5000
month 2: 5200
...
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
我真正需要的是取当前值减去前一个值。我得到了某个时间段之间的数据,并且在该时间段之前我已经包含了一个里程点。所以有可能得到每个月的总英里数,我只是不知道怎么做。我想要的是这个

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:对代码的解释

在结果列表的第一部分,我获取了每辆车的最新里程数。在第二部分,工会之后,我每月获取每辆车的最新里程数

试着这样做:

month 1: 5000
month 2: 5200
...
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
或者像这样使用秩


如果您只想减去之前的milage,请使用滞后函数:

select ml.*,
       (kilometerstand - lag(kilometerstand) over (partition by carid order by month)
       ) as diff
from totalmileagelist ml;
lag在SQL Server 2012+中可用。在早期版本中,可以使用相关子查询或外部应用

我错过了这个版本,因为它在标题中,而不是标签上。在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;

共享您的表架构并查询您尝试的表架构。我还没有尝试过这个查询,因为我不知道从哪里开始。我正在使用SQL server 2008,我将看一看外部应用程序。非常感谢。