2017-08-24 6 views
2

で二日間分散を計算する:は、私は以下の表を持って列

Fruit| date | profit | Rolling_Avg 
Apple|2014-01-16| 5.61 | 0.80 
Apple|2014-01-17| 3.12 | 1.25 
Apple|2014-01-18| 2.20 | 1.56 
Apple|2014-01-19| 3.28 | 2.03 
Apple|2014-01-20| 7.59 | 3.11 
Apple|2014-01-21| 3.72 | 3.65 
Apple|2014-01-22| 1.11 | 3.80 
Apple|2014-01-23| 5.07 | 3.73 

私が何をしようとしていることはとても例えば返されるテーブルは以下のようになる1の単位で日付によって分散を計算しています:

Fruit| date | profit | Rolling_Avg| Variance % 
Apple|2014-01-16| 5.61 | 0.80  | 
Apple|2014-01-17| 3.12 | 1.25  |-0.443850267 
Apple|2014-01-18| 2.20 | 1.56  |-0.294871795 
Apple|2014-01-19| 3.28 | 2.03  | 0.490909091 
Apple|2014-01-20| 7.59 | 3.11  | 1.31402439 
Apple|2014-01-21| 3.72 | 3.65  |-0.509881423 
Apple|2014-01-22| 1.11 | 3.80  |-0.701612903 
Apple|2014-01-23| 5.07 | 3.73  | 3.567567568 

私はこれを行う方法についてはよく分かりません。

私は日付がヘッダの代わりに、列だった場合、

sum(([2014-01-17] - [2014-01-16])/[2014-01-16])) as [variance %] 

が、再び、これはあなたがいるこの

答えて

1

あなたはLAG

以下

あなたの望ましい結果を与えるかもしれないクエリで使用してみてください。

クエリ

select fruit,vdate,profit,rolling_avg, 
    LAG(profit,1,0) over(order by day(vdate)) as previousprofit, 
    ((profit-LAG(profit) over(order by day(vdate)))/LAG(profit) over(order by day(vdate))) as variance_percent 
from variance 

Fiddle

+1

あなたは凡例です。ありがとう、これは完璧に動作します! – VS1SQL

1

を行うための最も効率的な方法で完全にわからないよう分散%を計算するために容易になるだろうと仮定統計に特定の定義を持つ「分散」は計算せず、「差」を計算します。このため、lag()を使用します。

select t.*, 
     (rolling_avg - 
     lag(rolling_avg) over (order by date) 
     ) as diff 
from t; 

私は「最近」との違いを行うだろう - 「以前」。あなたは他の方法を行っているようですので、オペランドの順序を逆にしてください。

+0

こんにちは、かなり確実ではない、これは私の質問に答えます。私は平均を移動しない利益のための上記の返された例を達成しようとしていることを明確にするために。以下の答えは私が探しているものです。分散を計算するための日付を書くより動的な方法が必要です。 – VS1SQL

0

あなたが以下のようにラグを使用することができます2012+ SQL Serverを使用している場合:

Select *, (Profit - PrevProfit)/PrevProfit as [variance %] from (
    Select *, PrevProfit = lag(profit) over(partition by fruit order by [date]) 
    from #fruitdata 
) a 
+0

こんにちは、これは私が当初持っていたものでしたが、利益と事前準備が手作業で入力される必要がないように書く方法はありますか?...この現在の解決方法は、それぞれの日付を入力する必要があることを意味します。 '[2014-01-17] - [2014-01-16])/ [2014-01-16]' '[2014-01-18] - [2014-01-17])/ [2014-01-17 ] 'を実行します。 – VS1SQL

+0

"利益と準備のために入力する必要はありません"とはどういう意味ですか?それに応じてサンプルデータを提供できますか? –

+0

基本的に私は上記の** 2番目の表**の**分散**列を達成しようとしています。私はすでに差額欄(例えば、利益** 3.12 ** - ** 5.61 **)/(利益前利益** 5.61 **)= ** - 0.443850267 **)に対する望ましい回答を示すためにExcelを使用し、それを配置しました返されるサンプルデータにあなたのスクリプトは、私のデータテーブルにない 'preprofit'という新しい列を導入します。 – VS1SQL

関連する問題