私は、(たとえば)ユーザーの大きなテーブルと、さまざまな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週間に新年の始まりを含むときにはうまくいかないと思います。
誰かが似たようなことをしたことがありますか?その場合、どのように問題にアプローチしましたか?異なるアプローチの提案も同様に評価されるだろう。
末尾3週間または1年の合計? –
@vkpこの今年と昨年の3週間の4つの期間(OPのように)は本当に好きですが、今年はどのようにするのか分かっていれば、それははるかに違うとは思いません昨年もやっています。 – user4601931
あなたが実行した日によって結果が異なるため、週テーブルは無関係です。この仮定は正しいですか? –