2017-03-05 10 views
0

の現在の値と前回値との差異を見つけることは例である:ここでは私はここで</p> <p>現在値と前回値との差異を見つける必要があり、SQL

enter image description here

は必要な出力です:

enter image description here

出力の説明:私たちは、現在のVAの違いを持っ​​ている必要がありますlueと以前の値とvalue_diffを見つける必要があります。

など。私たちは1Q16と2Q16で500を持っていますので、両方の違いは0です。したがって、2Q16行のvalue_diff列に0を表示する必要があります。

3Q16に1000があるので、3Q16と2Q16の差は500です。したがって、3Q16行のvalue_diff列に500を表示する必要があります。

私はCTEを使用して、いくつかのコードを試してみましたが、私は何かアドバイスが参考になる

..直接これを実行しているlag()をサポート2012+

+1

「3Q16」は発注に非常に悪いです。私はそれが遅すぎるのでなければ '16Q3'に変更したいと思います。 – shmosel

答えて

2

SQL Serverをこのいずれかを実行するのに最適な方法を見つけることができませんでした。 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; 
関連する問題