提前谢谢。
我有一张桌子:
ID | NAME | Value
---+---------+-------------
1 | ABC | 1987698.987
2 | DEF | 1987870.987
3 | GHI | 1987990.987
4 | JKL | 1988200.987
输出:
ID | NAME | Value | Cumulative_difference
---+-------+-------------+----------------------
1 | ABC | 1987698.987 | 0
2 | DEF | 1987870.987 | 172
3 | GHI | 1987990.987 | 120
4 | JKL | 1988200.987 | 210
cumulative_difference的计算是=(1987870.987 - 1987698.987)否则'0'
这是我使用过的查询,但我得到负值:
select
id, name, value, value
-LAG(value, 1, 1) over (partition by name order by id)
from
table1
任何帮助都将不胜感激。
我正在使用SQL Server 2012。
谢谢
答案 0 :(得分:2)
使用LAG (Transact-SQL)
select id,name,value,isnull(value - LAG(value) over(order by id),0) Cumulative_difference
from table1
Out put:
id name value Cumulative_difference
1 ABC 1987698.987 0.00
2 DEF 1987870.987 172.00
3 GHI 1987990.987 120.00
4 JKL 1988200.987 210.00
答案 1 :(得分:1)
正常连接怎么样(如果你有自动增量ids
)?
SELECT T.ID,
T.NAME,
T.VALUE,
ISNULL(T.VALUE - T1.VALUE, 0) [Cumulative_difference]
FROM table T
LEFT JOIN table T1 ON T1.ID + 1 = T.ID;
结果:
ID NAME VALUE Cumulative_difference
1 ABC 1987698.987 0.00
2 DEF 1987870.987 172.00
3 GHI 1987990.987 120.00
4 JKL 1988200.987 210.00
答案 2 :(得分:1)
您可以使用标准ANSI
OLAP函数或LAG()
以及coalesce
,如下所示。
SELECT t1.*
,coalesce(value - min(value) OVER (
ORDER BY id rows BETWEEN 1 preceding
AND 1 preceding
), 0) AS commulative_diff
FROM table1 t1
OR
SELECT t1.*,
coalesce(value - lag(value) over(
ORDER BY id),0) AS commulative_diff
FROM table1 t1
<强>结果强>
ID NAME Value commulative_diff
------------------------------------
1 ABC 1987698,987 0.000
2 DEF 1987870,987 172.000
3 GHI 1987990,987 120.000
4 JKL 1988200,987 210.000
<强> DEMO 强>