Sql 选择字段值减去上一个字段值
我有一个select查询,它可以得到CarID、月份、里程和二氧化碳排放量。 现在每个月每辆车的里程如下: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
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,我将看一看外部应用程序。非常感谢。