2017-05-05 19 views
0

私は、(たとえば)ユーザーの大きなテーブルと、さまざまなWebページへの訪問者を持っています。テーブルの例は次のようになります。3週間の合計期間を取得する

schema.page_views 

     date| user_id|   webpage| 
----------+---------+----------------+ 
01/05/2012|aaaaaaaaa|www.example1.com| 
01/06/2012|aaaaaaaaa|www.example2.com| 
01/06/2012|ababababa|www.example1.com| 
        ... 
01/05/2013|aaaaaaaaa|www.example2.com| 
01/05/2013|ababababa|www.example1.com| 
03/05/2013|aaaaaaaaa|www.example2.com| 

また、私はカレンダーのルックアップテーブルを持っている:

schema.weeks 

week_number| begin_date| end_date|year| 
-----------+-----------+-----------+----+ 
     18| 2012-04-23| 2012-04-30|2012| 
     17| 2012-04-15| 2012-04-22|2012| 
     16| 2012-04-08| 2012-04-14|2012| 

私は最終的にこの2つのテーブルから希望するとページビューの末尾の3週間の合計です。 「1-3」は直近3週間を指し

  webpage| 1-3| 4-6| 7-9| 10-12| 
----------------+-------+-------+-------+-------+ 
www.example1.com| 124875| 175682| 168542| 159780| 
www.example2.com| three week period numbers | 

は、「4-6」に4を参照:私は今日このクエリを発行した場合は具体的には、私はの線に沿って何かをしたいと思います6週間前、など

はこれまでのところ、私は次のように、各ウェブサイトおよび週の毎週の総ページビューを得てきました:

-- join to get begin and end_dates 
with t1 as (
select a.*, b.* from schema.page_views a 
join schema.weeks b 
on a.date between b.begin_date and b.end_date), 

-- now aggregate per week 
weekly_vol as (
select webpage, year, week_number, begin_date, end_date, 
count(*) volume 
from t1 
group by 1, 2, 3, 4, 5) 

select * from weekly_vol limit 1; 

は、例えば、

  webpage| year| week_number| begin_date| end_date| volume| 
----------------+-----+------------+-----------+-----------+-------+ 
www.example1.com| 2012|   18| 2012-04-23| 2012-04-30| 41871| 
を与えます

このようなテーブルを使って、私が望むテーブルにどうやって行くことができますか?私はon a.week_number between b.week_number and b.week_number + 2のようなものにそれ自身を参加させることを考えましたが、私はこの考えが最後の12週間に新年の始まりを含むときにはうまくいかないと思います。

誰かが似たようなことをしたことがありますか?その場合、どのように問題にアプローチしましたか?異なるアプローチの提案も同様に評価されるだろう。

+0

末尾3週間または1年の合計? –

+0

@vkpこの今年と昨年の3週間の4つの期間(OPのように)は本当に好きですが、今年はどのようにするのか分かっていれば、それははるかに違うとは思いません昨年もやっています。 – user4601931

+0

あなたが実行した日によって結果が異なるため、週テーブルは無関係です。この仮定は正しいですか? –

答えて

1

あなたの質問は少し不明です。週数は1年以内か、それともいつもですか?先週のデータを基準にして、または現在の日付との相対的な合計を求めますか?

いずれにしても、次のようなことは少なくともあなたが望むものと似ています。キーは、外部クエリの条件付き集計です。

with t1 as (
     select pv.*, w.*, 
      max(pv.week_number) over (partition by webpage, year) as last_week_number 
     from schema.page_views pv join 
      schema.weeks w 
      on pv.date between w.begin_date and w.end_date 
    ), 
    weekly_vol as (
     select webpage, year, week_number, begin_date, end_date, 
      count(*) as volume 
     from t1 
     group by webpage, year, week_number, begin_date, end_date 
    ) 
select webpage, year, 
     sum(case when last_week_number - week_number < 3 
       then volume else 0 
      end) as week_1_3, 
     sum(case when last_week_number - week_number >= 3 and last_week_number - week_number < 6 
       then volume else 0 
      end) as week_4_6 
from weekly_vol 
group by webpage, year; 
+0

'最大(pv.week_number)以上(ウェブページ、パーティションによるパーティション)'は、ウェブページが1年で存在するすべての日/週を考慮しません。計算は私の意見ではありません。 –

+0

明快さに欠けて申し訳ありません...あなたの特定の質問に答えるには:週数は1年以内です(毎年1〜52)。これは2番目から最後の段落の最後の文で(暗黙のうちに、私が推測する)暗示された。例は、2番目の質問に役立つかもしれません... – user4601931

+0

今日の日付を考えれば、19週目です(週間表を見て)。私は週17,18、および19(所望の結果表の「1-3」列の値になります)の各Webサイトのページビューの合計数を14、15、および16(「4-6」列の入力)などがあります。これは、2017年1月5日(たとえば)の場合は、2017年の第1週から合計を、第51週と第52週の合計で '1 -3 '欄に示す。 – user4601931

関連する問題