【问题标题】:find a difference between current value and previous value in sql在sql中查找当前值和先前值之间的差异
【发布时间】:2017-03-05 04:00:36
【问题描述】:

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

这是一个例子:

这里是必需的输出:

输出说明:我们需要当前值和之前的值有差异,需要找到value_diff。

例如我们在 1Q16 和 2Q16 有 500 个所以,它们之间的差异是 0..所以,它需要在 2Q16 行的 value_diff 列中显示 0。

我们在 3Q16 有 1000 所以,3Q16 和 2Q16 之间的差异是 500.. 所以,它需要在 3Q16 行的 value_diff 列中显示 500。

我尝试了一些使用 CTE 的编码,但我没有找到一个完美的方法来完成这个..

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

【问题讨论】:

  • 3Q16 对订购非常不利。如果还不算太晚,我会把它改成16Q3

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


【解决方案1】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多