0

列 (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 には定期的なルールはなく、増加する整数値であるだけで、例の表に示すように不規則な量だけ増加します。

編集: MS SQL Server 2005 を使用

4

2 に答える 2

1
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

( SQL Serverのleadおよび関数のサポートが実装されていることを本当に望んでいます:|)lag

于 2010-05-19T14:29:08.900 に答える
0

おそらくこれよりも簡潔な方法がありますが、試してみてください。

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
于 2010-05-19T14:21:41.133 に答える