SQL выбирает построчное увеличение суммы столбца промежуточной суммы

Предположим, у меня есть таблица со столбцами (DayId, RunningTotal):

DayId    RunningTotal
---------------------
1        25
3        50
6        100
9        200
10       250

Как я могу выбрать DayId и сумму, на которую RunningTotal увеличился по сравнению с предыдущим днем? то есть как я могу выбрать:

DayId    DayTotal
---------------------
1        25
3        25
6        50
9        100
10       50

Единственный текущий метод, который я знаю, - это цикл while, который я пытаюсь исключить. Кроме того, DayId не имеет обычных правил, просто это некоторое возрастающее целочисленное значение, но оно увеличивается на неравномерную величину, как показано в таблице примеров.

EDIT: использование MS SQL Server 2005


person Rich    schedule 19.05.2010    source источник
comment
Вы можете добавить столбец, который говорит вам о предыдущем дне?   -  person Avitus    schedule 19.05.2010
comment
какой сервер базы данных и версия?   -  person araqnid    schedule 19.05.2010
comment
@Avitus: я мог бы сделать это только в том случае, если бы это было частью запроса, то есть создание временной таблицы и каким-то образом вставка предыдущего дня для каждой строки. Схема уже хорошо установлена ​​и развернута   -  person Rich    schedule 19.05.2010


Ответы (2)


with cte as (
  select dayid, runningtotal, row_number() over (order by dayid asc) as row_index
  from #the_table
)
select cur.dayid, cur.runningtotal - coalesce(prev.runningtotal, 0) as daytotal
from cte cur
     left join cte prev on prev.row_index = cur.row_index - 1

(Мне бы очень хотелось, чтобы они реализовали поддержку функций lead и lag в SQL Server :|)

person araqnid    schedule 19.05.2010

Вероятно, есть более лаконичный способ, но попробуйте:

select t3.DayId, 
    case when t4.DayId is null then t3.RunningTotal else t3.RunningTotal - t4.RunningTotal end as DayTotal
from (
    select t1.DayId, max(t2.DayId) as PreviousDayId as 
    from MyTable t1
    left outer join MyTable t2 on t2.DayId < t1.DayId
    group by t1.DayId    
) a
inner join MyTable t3 on a.DayId = t3.DayId
left outer join MyTable t4 on a.PreviousDayId = t4.DayId
person D'Arcy Rittich    schedule 19.05.2010