2017-11-07 2 views
1

同じ列の値を減算したい場合、この減算は非常に次の行で行う必要があります。次の行の列の値を減算する方法SQLサーバー

Table Data having 2 columns

iは、行1、行2及びレコードを減算したいように (ROW2 X - ROW1 x)の

+0

注文はありますか?言い換えれば、行の順序を指定する属性がありますか? –

+0

はい、ID番号 –

答えて

1

ANSI標準OLAPの機能を使用して、目的の結果を得ることができます。

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

上記のクエリは、行n + 1およびディスプレイからid及び減算行nによって結果をソート列と共に結果とともにn

サンプルデータをもたらす:

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

DEMO

1

あなたがあなたのテーブルに参加autoにあなたのテーブルの上にIDが必要になります。あなたがIDをお持ちでない場合は、order clauseそれを決定するために、

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 

EDIT:

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. 

使用剰余演算子は、別名Aに別名Bを有する第二の部分を半分部分を選択します警告:SQLテーブル内のデータは注文されません。あなたイースリーIDまたはTimesstampなどの特定の列なしで挿入順序を保持することはできません...

2

あなたはLEADを使用することができます。

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

あなたが行を注文する必要があります。上記の例では、私はこれをIDで行っていますが、あなたは何でも持っています。

2

ここでは他の動的な方法は、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はあなたのすべてのレコードを取得し、それぞれの固有のエントリの行番号を適用します。追加のエントリごとに増分する番号が付けられます。

+0

という名前のユニークな列があります。警告! https://stackoverflow.com/questions/4810627/sql-server-2005-row-number-without-order-by – Indent

関連する問題