繁体   English   中英

如何在下一行SQL Server中减去列值

[英]How to subtract column value in next row SQL server

我想减去同一列中的值,这种相减应在下一行进行。

具有2列的表数据

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

您可以使用LEAD

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

您需要对行进行排序。 在上面的示例中,我已按ID进行了此操作,但是您可以使用任何已有的东西。

这是另一种动态方式,是在row_number函数的帮助下使用CTE将排名分配给每一行。

;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将获取您的所有记录,并为每个唯一条目应用行号。 每个其他条目将获得一个递增的数字。

您需要在表上有一个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之类的特定列,您将无法轻松保留插入顺序。

您可以如下使用ANSI标准OLAP函数来获得所需的结果。

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

上面的查询按id对结果进行排序,并从第n + 1行中减去第n行,并将结果与​​第n行一起显示

样本数据以及结果:

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

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM