Разница SQL между строками - PullRequest
20 голосов
/ 10 июня 2011

У меня есть таблица базы данных SQL 2008, как эта

name      score
-----------------------
steve     207
steve     205
steve     200
steve     139

Я хочу получить разницу между строками.eqn = [row - (row + 1)], поэтому в идеале я бы хотел, чтобы это было,

steve 2   //207 - 205
steve 5   //205 - 200
steve 61  //200 - 139
steve 139 //139 - 0

Каков наилучший способ сделать это?Спасибо!

Ответы [ 2 ]

17 голосов
/ 10 июня 2011

Это один из способов сделать это

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
7 голосов
/ 10 июня 2011

Еще один способ сделать это - использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...