在sql

时间:2017-03-05 04:00:36

标签: sql sql-server database sql-server-2008

我需要找出当前值与之前值之间的差异

以下是一个例子:

enter image description here

这是必需的输出:

enter image description here

输出说明:我们需要在当前值和之前的值之间有区别,需要找到value_diff。

E.g。我们在1Q16和2016年第2季度有500个,因此,它们之间的差异为0 ..因此,它需要在2Q16行的value_diff列中显示0。

我们在2016年第3季度有1000个,因此2016年第3季度和2016年第2季度之间的差异为500.因此,它需要在2016年第3季度的value_diff列中显示500个。

我尝试使用CTE进行编码,但我找不到完美的方法来做这个..

任何建议都会有所帮助..

1 个答案:

答案 0 :(得分:2)

SQL Server 2012+支持lag()直接执行此操作。在SQL Server 2008中,我建议使用outer apply。我首先假设quarter是一种正确排序的合理格式,例如YYYY-Q:

select t.*, (t.value - tprev.value) as diff
from t outer apply
     (select top 1 tprev.*
      from t tprev
      where tprev.id = t.id and
            tprev.yyyyq < t.yyyyq
      order by tprev.yyyyq desc
     ) tprev;

quarter的格式很糟糕。让我们用CTE解决这个问题:

with t as (
      select e.*,
             ('20' + right(quarter, 2)) + '-' + left(quarter, 1)) as yyyyq
      from example e
     ) 
select t.*, (t.value - tprev.value) as diff
from t outer apply
     (select top 1 tprev.*
      from t tprev
      where tprev.id = t.id and
            tprev.yyyyq < t.yyyyq
      order by tprev.yyyyq desc
     ) tprev;