1

次のように、地域と月でグループ化された3か月の移動平均を計算しようとしています。

Region  Month                 Avg(var_a)    Avg(var_b)
Northland   Dec-Jan-Feb       7.1           5.9
Southland   Dec-Jan-Feb       7.2               6.1
Northland   Nov-Dec-Jan       7.4           6.1
Southland   Nov-Dec-Jan       7.5           6.2
Northland   Oct-Nov-Dec       7.5               6.2
Southland   Oct-Nov-Dec       7.5           6.1

説明の目的で月が拡張されていることに注意してください。実際には、出力は1か月と言っているだけだと思います。

これを行うには、地域と月ごとにCTEグループを作成し、次のように数回参加します。

With month_rollup_cte as
    (Select region,month,sum(var_a) a_sum, sum(var_b) b_sum, count(1) cnt
From vw_score_by_region
    Group by region,month)
Select c1.region, c1.month,sum(c1.a_sum + c2.a_sum + c3.a_sum) / sum(c1.cnt + c2.cnt + c3.cnt) a_avg, sum(c1.b_sum + c2.b_sum + c3.b_sum) / sum(c1.cnt + c2.cnt + c3.cnt) b_avg
From month_rollup_cte c1
Join month_rollup_cte c2 on c1.region = c2. Region and c1.month = dateadd(mm,1,c2.month)
Join month_rollup_cte c3 on c1.region = c3. Region and c1.month = dateadd(mm,2,c3.month)
Group by c1.region, c1.month;

しかし、それは醜いです。6か月の移動平均または12か月の移動平均を実行する必要があるかどうかを想像してください…私はt-sql 2012分析関数、特にRANGEオプションを使用しようとしています。以前にROWSを使用したことがありますが、範囲はありません。

私が試したのは

select region,avg(var_a) OVER (order by (year(entry_month) * 100 + month(entry_month)) range between 2 preceding and 1 following)    
from [dbo].[vw_score_by_region]
group by region

しかし、構文エラーが発生します。

*メッセージ8120、レベル16、状態1、行2
の列'dbo.vw_score_by_region.month'は、集計関数にもGROUP BY句にも含まれていないため、選択リストでは無効です。*

明らかに私は愚かなことをしているが、何をしているのかわからない。

4

1 に答える 1

1

まず、RANGEはUNBOUNDEDおよびCURRENT ROWフレーム区切り文字でのみサポートされています。N PRECEDINGまたはN FOLLOWINGでは使用できません。
あなたのタイトルから、3 か月のローリング平均 (スライド平均) を取得したいように見えます。次に、ROWS を使用してROWSを使用することをお勧めします (これは、必要なものである可能性が高くなります) SQl Fiddle Demo


select region,
       avg(var_a) OVER (partition by region 
                        order by (entry_month) 
                        rows between 2 preceding and current row) as ThreeMonthSlidingAvg  
from [dbo].[vw_score_by_region]

ノート:

年と月を計算する必要はありません。entry_month が date または datetime の場合は、すでにソート可能です。Steve の修正に感謝します。
範囲の使用:

select region,
       avg(var_a) OVER (partition by region,(year(entry_month) * 12 + month(entry_month))/3
order by (entry_month) range between unbounded preceding and current row) as ThreeMonthSlidingAvg
from [dbo].[vw_score_by_region]
注: RANGE を使用すると、パーティション幅を制御する必要があります。これは、3 か月ごとに集計する必要があり、範囲はN PRECEDINGおよびN FOLLOWINGをサポートしていないため、以下のみをサポートします。

| | 無制限先行 | パーティションの最初の行でウィンドウを開始します
| | 無制限のフォロー| パーティションの最後の行でウィンドウを終了します
| | 現在の行 | 現在の行でウィンドウを開始または終了します
于 2013-03-23T09:39:55.807 に答える