行之间的SQL差异

问题描述

| 我有一个像这样的sql 2008数据库
name      score
-----------------------
steve     207
steve     205
steve     200
steve     139
我想了解行之间的差异。 eqn = [行-(行+ 1)] 所以我理想地希望它成为
steve 2   //207 - 205
steve 5   //205 - 200
steve 61  //200 - 139
steve 139 //139 - 0
做这个的最好方式是什么? 谢谢!     

解决方法

        这是做到这一点的一种方法
with cte as
(SELECT
   ROW_NUMBER() OVER (PARTITION BY table.name ORDER BY id) row,name,score
 FROM table)
SELECT 
   a.name,a.score - ISNULL(b.score,0)
FROM
   cte a
   LEFT  JOIN cte b
   on a.name = b.name
    and a.row = b.row+1
    ,        另一种方法是使用lag():
SELECT
   name,score - coalesce(lag(score) over (partition by name order by id),0)
FROM table
ORDER BY name,id
lag()函数似乎在TSQL中不可用,但注释中建议使用此替代方法:
select name,score - coalesce(
    MIN(score) OVER (PARTITION BY name ORDER BY id
             ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING),0) as diff
from table
order by name,id