如何为列字段获取两行之间的差异?

时间:2009-03-11 13:43:53

标签: sql sql-server tsql sql-server-2005

我有一张这样的表:

rowInt  Value
2       23
3       45
17      10
9       0
....

列rowInt值是整数但不是具有相同增量的序列。我可以使用以下sql按rowInt列出值:

SELECT * FROM myTable ORDER BY rowInt;

这将按rowInt列出值。如何获得两行之间的Value的差异,结果如下:

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(Miscrosoft)

8 个答案:

答案 0 :(得分:54)

SELECT
   [current].rowInt,
   [current].Value,
   ISNULL([next].Value, 0) - [current].Value
FROM
   sourceTable       AS [current]
LEFT JOIN
   sourceTable       AS [next]
      ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)

编辑:考虑一下,在select(ala Quassnoi的回答)中使用子查询可能会更有效率。我会试用不同的版本,然后查看执行计划,看看哪个版本对你拥有的数据集的性能最佳...

答案 1 :(得分:25)

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

答案 2 :(得分:11)

如果你真的想确定订单,请使用“Row_Number()”并比较当前记录的下一条记录(仔细查看“on”子句)

T1.ID + 1 = T2.ID

您基本上使用当前行加入下一行,而不指定“min”或执行“top”。如果您有少量记录,“Dems”或“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

答案 3 :(得分:9)

SQL Server 2012及更高版本支持LAG / LEAD函数可访问上一行或后续行。 SQL Server 2005不支持此功能(在SQL2005中,您需要连接或其他内容)。

有关此数据的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

LEAD(value)将返回" over"中给定顺序的下一行的值。条款。

答案 4 :(得分:2)

SQL Server是否支持分析功能?

select   rowint,
         value,
         value - lag(value) over (order by rowint) diff
from     myTable
order by rowint
/

答案 5 :(得分:0)

select t1.rowInt,t1.Value,t2.Value-t1.Value as diff
from (select * from myTable) as t1,
     (select * from myTable where rowInt!=1
      union all select top 1 rowInt=COUNT(*)+1,Value=0 from myTable) as t2
where t1.rowInt=t2.rowInt-1

答案 6 :(得分:0)

查询以查找单列的2行之间的日期差异

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

答案 7 :(得分:0)

我只是为此做一个小功能。输入两个值,您需要知道两者之间的差异,并从较大的值中减去较小的值。像这样:

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