如何在下一行SQL服务器中减去列值

时间:2017-11-07 08:02:01

标签: sql sql-server tsql sql-server-2012

我想在同一列中减去值,这个减法应该在下一行完成。

Table Data having 2 columns

我想在第1行和第2行中减去记录,依此类推 (row2 x - row1 x)

4 个答案:

答案 0 :(得分:2)

您可以使用LEAD

SELECT x
      ,lead(x, 1, 0) OVER (ORDER BY id) - x
From myTable;

您需要订购行。在上面的示例中,我通过ID完成了此操作,但您可以使用您拥有的任何内容。

答案 1 :(得分:2)

其他动态方法是在CTE函数的帮助下使用row_number将为每行分配排名。

;WITH CTE AS 
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) RN FROM <table_name>
),
CTE1 AS
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) RN FROM <table_name>
)
SELECT C1.X - C.X [x] FROM CTE C 
INNER JOIN CTE1 C1 ON C1.RN = C.RN+1

说明: CTE将获取所有记录并为每个唯一条目应用行号。每个附加条目都将获得递增数字。

答案 2 :(得分:1)

您需要桌面上的ID才能自动加入您的桌子。 使用模运算符选择带别名A的半部分和带别名B的第二部分:

select
    A.*,
    B.*,
    B.X-A.X as DELTA
from
    theTable A inner theTable B on
        A.ID+1=B.ID
where
    A.ID % 2 = 1

编辑,如果您没有ID,请order clause来确定它:

with order_table (
    select
        ROW_NUMBER ()   
            OVER ( order by ??? ) as ID,
        *
    from
        theTable
)
select
    A.*,
    B.*,
    B.X-A.X as DELTA
from
    order_table A inner order_table B on
        A.ID+1=B.ID
where
    A.ID % 2 = 1

replace `???` by your criteria.

警告:未订购sql表中的数据。如果没有ID或Timesstamp ...

等特定列,则无法轻松保留插入顺序

答案 3 :(得分:1)

您可以使用下面的ANSI标准OLAP功能来获得所需的结果。

SELECT x,
       min(x) over(
                   ORDER BY id ROWS BETWEEN 1 following AND 1 following) - x AS RESULT
FROM table1;

上述查询按id对结果进行排序,并从行n中减去行n + 1并显示结果以及行n

示例数据以及结果:

x                   RESULT
-----------------------------------
318963.0000000000   -95.9999999990
318867.0000000010   -128.0000000000
318739.0000000010   128.0000000000
318867.0000000010   NULL

<强> DEMO