2015-03-25 8 views
1

У меня есть таблица базы данных с двумя столбцами, обозначающими кусок, diff и тип.вычесть данные из одного столбца

Вот что таблица выглядит

id | piece | diff | type 
1 | 20 | NULL | cake 
2 | 15 | NULL | cake 
3 | 10 | NULL | cake 

Я хочу, как 20 - 15 = 5, то 15 -10 = 5, а затем так далее так форте с типа, где.

Результат будет как этот

id | piece | diff | type 
1 | 20 | 0 | cake 
2 | 15 | 5 | cake 
3 | 10 | 5 | cake 

Вот код, который я до сих пор, но я не думаю, что я на правильном пути

SELECT 
    tableblabla.id, 
    (tableblabla.cast(pieces as decimal(7, 2)) - t.cast(pieces as decimal(7, 2))) as diff 
FROM 
    tableblabla 
INNER JOIN 
    tableblablaas t ON tableblabla.id = t.id + 1 

Спасибо за помощь

ответ

3

использования LAG/LEAD окно функция.

Учитывая, что вы хотите найти Difference за type остальное удалить Partition by из функций окна

select id, piece, 
     Isnull(lag(piece)over(partition by type order by id) - piece,0) as Diff, 
     type 
From yourtable 

Если вы используете Sql Server перед 2012 использовать это.

;WITH cte 
    AS (SELECT Row_number()OVER(partition by type ORDER BY id) RN,* 
     FROM Yourtable) 
SELECT a.id, 
     a.piece, 
     Isnull(b.piece - a.piece, 0) AS diff, 
     a.type 
FROM cte a 
     LEFT JOIN cte b 
       ON a.rn = b.rn + 1