2016-07-06 13 views
1

私はこの問題をしばらく解決しています。基本的に私はUserIdとTimeStampを使って簡単なデータセットを持っています。週ごとに表示されるUserIdの個数を知りたいのですが、Weekofyear()が使用するのは月曜日から日曜日ではなく、日曜日から土曜日までの週が計測されます。今、私は毎週ハードコーディングして、クエリを実行している週にシフトすることでHiveのWeekofyearを騙して数えます

SELECT 
count(distinct UserId) 
FROM data.table 
where from_unixtime((CAST(timestamp as BIGINT))) 
     between TO_DATE("2016-06-05") AND TO_DATE("2016-06-12") 

私は日曜日考えにweekofyearだまして一日戻ってタイムスタンプをシフトする方法を見つけるためにしようとしているが、実際に月曜日です成功していません。私の最近の無駄な試みは次のようになりました:

SELECT 
count(distinct UserId), weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1)) 
FROM table.data 
where from_unixtime((CAST(timestamp as BIGINT))) 
     between TO_DATE("2016-06-01") AND TO_DATE("2016-06-30") 
     group by weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1)) 

これは、私が1日を引いたものと同じ数字になります。なぜこれが動作していないのか分かりません。私はこれを管理する方法があるべきであるように感じる。今は、週Xですべてのデータを取得したい場合は、手動で毎週行う必要がありますが、それは持続可能ではありません。どのようによりスマートに作業するための提案?

ありがとうございます。

答えて

1

シンプルなソリューション

あなたは単にあなた自身の数式を作成する代わりに、「今年の一週間」のための事前定義された機能と一緒に行くことができ 利点:あなたは週に7日間の任意のセットを取ることができるようになります。あなたのケースでは

あなたは週が私達はちょうど2016年

EG-に日曜日の最初の日が必要になります日曜日から土曜日から開始する必要があり、最初の日曜日は、2016年1月3日「でありたいので、私はあなたが切り捨てする)(下使用しようとしていると思う 『YYYY-MM-DD

SELECT 
    count(distinct UserId), lower(datediff(timestamp,'2016-01-03')/7) + 1 as week_of_the_year 
    FROM table.data 
    where timestamp>='2016-01-03' 
    group by lower(datediff(timestamp,'2016-01-03')/7) + 1; 
+0

'形式でタイムスタンプ列を考慮しJan'16 --assumptionの第三これは』?もしそれがハイヴで働いていなかったのですが、私はINTとしてキャストされました。それはトリックを行ったようです!ありがとうございました! –

関連する問題