Sql 如何获取列字段的两行之间的差异?
我有一张这样的桌子:Sql 如何获取列字段的两行之间的差异?,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我有一张这样的桌子: rowInt Value 2 23 3 45 17 10 9 0 .... rowInt Value Diff 2 23 22 --45-23 3 45 -35 --10-45 9 0 -45 --0-45 17 10 10 -- 10-0 .... 列rowInt值为整数,但不在具有相同增量的序列中。我可以使用以下sq
rowInt Value
2 23
3 45
17 10
9 0
....
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
列rowInt值为整数,但不在具有相同增量的序列中。我可以使用以下sql按rowInt列出值:
SELECT * FROM myTable ORDER BY rowInt;
这将按rowInt列出值。如何得到两行之间的差值,结果如下:
rowInt Value
2 23
3 45
17 10
9 0
....
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
该表位于SQL 2005 Mistrosoft中
SELECT rowInt, Value,
COALESCE(
(
SELECT TOP 1 Value
FROM myTable mi
WHERE mi.rowInt > m.rowInt
ORDER BY
rowInt
), 0) - Value AS diff
FROM myTable m
ORDER BY
rowInt
编辑:
考虑一下,在select-snoi的答案中使用子查询可能更有效。我会尝试不同的版本,看看执行计划,看看哪一个在您拥有的数据集大小上表现最好
编辑2:
尽管不太可能有很多人仍然使用SQLServer2005,但我仍然看到这一点正在赢得选票
如果您可以访问窗口功能,如LEAD,则使用该功能
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable
如果您真的想确定订单,请使用Row_Number并比较当前记录的下一条记录仔细查看on子句
T1.ID + 1 = T2.ID
您基本上是将下一行与当前行连接在一起,而不指定min或do top。如果您有少量记录,DEM或Quassanoi的其他解决方案也可以
with T2 as (
select ID = ROW_NUMBER() over (order by rowInt),
rowInt, Value
from myTable
)
select T1.RowInt, T1.Value, Diff = IsNull(T2.Value, 0) - T1.Value
from ( SELECT ID = ROW_NUMBER() over (order by rowInt), *
FROM myTable ) T1
left join T2 on T1.ID + 1 = T2.ID
ORDER BY T1.ID
SQL Server是否支持分析功能
select rowint,
value,
value - lag(value) over (order by rowint) diff
from myTable
order by rowint
/
查询以查找单个列的两行之间的日期差
SELECT
Column name,
DATEDIFF(
(SELECT MAX(date) FROM table name WHERE Column name < b. Column name),
Column name) AS days_since_last
FROM table name AS b
SQL Server 2012及更高版本支持/功能以访问上一行或后续行。SQLServer2005不支持此功能。在SQLServer2005中,您需要连接或其他功能 关于此数据的SQL 2012示例
/* Prepare */
select * into #tmp
from
(
select 2 as rowint, 23 as Value
union select 3, 45
union select 17, 10
union select 9, 0
) x
/* The SQL 2012 query */
select rowInt, Value, LEAD(value) over (order by rowInt) - Value
from #tmp
LEADvalue将返回与给定order in over子句相关的下一行的值 我只需要做一个小函数就可以了。输入两个值,你需要知道它们之间的差异,并让它从较大的值中减去较小的值。比如:
CREATE FUNCTION [dbo].[NumDifference]
( @p1 FLOAT,
@p2 FLOAT )
RETURNS FLOAT
AS
BEGIN
DECLARE @Diff FLOAT
IF @p1 > @p2 SET @Diff = @p1 - @p2 ELSE SET @Diff = @p2 - @p1
RETURN @Diff
END
在获取列a和列b之间差异的查询中:
SELECT a, b, dbo.NumDifference(a, b) FROM YourTable
第二排是10-45吗?你从哪里取10?有些计算不一致。。。第2行的45-23是第3-2行,但第9行的0-45是第9-3行,是否应该是第17-9行的10-0?您似乎想计算原始行集中相邻值之间的差异2、3、17、9。然后我必须问您:原始行集排序的列是什么?记住,SQL中没有“默认顺序”这样的东西。无论如何,修复这个问题-10-45是不对的。如果他在rowInt上有一个索引,我想他会这样做,那么我的查询效率会更高。如果他没有,那么你的问题是,在这种情况下,是否有可能谈论效率。在这里查看详细信息:我创建了一个包含100万条随机创建的记录的虚拟表,发现两个查询占用的时间相同。事实上,执行计划的唯一区别是排序函数的位置,我对最终输出msg 195,级别15,状态10进行排序,第3行“lag”不是一个可识别的内置函数名。我之所以给出这一点,是因为Denali是这样做的……尽管在给出这个答案时sql server可能没有这样做posted@FairFunk我减去了一个点,因为这个问题被标记为2005,所以Denali的功能是不相关的。这是一个非常老的问题,你的答案并不完全相同提出的问题。滞后。不是,小伙子。它不允许我编辑,因为你必须更改6个字符。这是最好的解决方案。其他答案是独创性的,但这是有效的。@DonkeyKong-其他答案反映了问题是针对SQL Server 2005的,它不支持分析/窗口函数。