【问题标题】:How to subtract column value in next row SQL server如何在下一行SQL Server中减去列值
【发布时间】:2018-04-19 13:08:05
【问题描述】:

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

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

【问题讨论】:

  • 有什么命令吗?换句话说,是否有指定行顺序的属性?
  • 是的,我有一个名为 ID 的唯一列

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


【解决方案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 + 1行中减去n行,并将结果与​​n行一起显示

样本数据和结果:

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

DEMO

【讨论】:

    【解决方案2】:

    你可以使用LEAD:

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

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

    【讨论】:

      【解决方案3】:

      这里是另一种动态方式是使用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 将获取您的所有记录并为每个唯一条目应用一个行号。每个额外的条目都会得到一个递增的数字。

      【讨论】:

      【解决方案4】:

      您的桌子上需要一个 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 等特定列,您将无法轻松保留插入顺序...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多