答案 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 强>