Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取列字段的两行之间的差异?_Sql_Sql Server_Tsql_Sql Server 2005 - Fatal编程技术网

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的,它不支持分析/窗口函数。