2016-12-19 12 views
1
month first_member 
201612 135054 
201611 250507 
201610 296114 
201609 317501 
201608 427143 
201607 449202 
201606 398261 
201605 419880 
201604 393784 
201603 459383 
..... 

ここに2列のテーブルがあります。私は与えられた月のfirst_memberの前の12ヶ月の合計を計算したいと思います。たとえば、新しいテーブルの1レコードには201605と201505〜201605の間のfirst_memberの合計が含まれています。新しいテーブルを作成するためにクエリをどのように作成するのですか。 月は文字列型で、first_memberはintです。ハイブクエリ言語を使用してこのテーブルから前の12ヶ月間の合計値を計算するにはどうすればよいですか?

答えて

1

monthの列がYYYYMMの形式のときに分割する必要はありません。

select "month" 

     ,sum(first_member) over 
     (
      order by "month" 
      rows  between 12 preceding and 1 preceding 
     ) as running_total 

from tablename 
+0

ありがとう、完璧に実行 – yanachen

+0

コードが別のデータセットでエラーを実行することは残念です。私は貼り付けられたデータで新しい質問を開きます。問題を解決するためにお手伝いしていただけますか?ありがとう。 – yanachen

+0

http://stackoverflow.com/questions/41217071/hive-time-window-functions-bug – yanachen

1

sumウィンドウ機能を使用してください。これは、毎月first_memberの過去12ヶ月の合計をあなたに与えるでしょう。

select month, 
sum(first_member) over(order by cast(substr(month,1,4) as int),cast(substr(month,5) as int) 
         rows between 11 preceding and current row) rolling_sum 
from tablename 

編集:OPさんのコメントパー私は201605 を含める201505を含むがないようにする、必要な変更は、これはfirst_memberが間の毎月の値を持っていると仮定していること

select month, 
sum(first_member) over(order by cast(substr(month,1,4) as int),cast(substr(month,5) as int) 
         rows between 12 preceding and 1 preceding) rolling_sum 
from tablename 

注だろう指定された時間枠。

+0

タイムウィンドウには201505に201605が含まれていませんか? – yanachen

+0

結果に201505のfirst_memberが必要な場合は、 '11 preceding'ではなくwindow specificationに' 12 preceding'を使います。 –

+0

実際、201505はインクルードしたいが、201605はインクルードしないでください。どうすればクエリを変更できますか? – yanachen

関連する問題