2017-05-05 24 views
0

我有一個(說)用戶的大表以及他們訪問各種網頁的情況。該表的一個例子是:在過去的三週時間段內獲取總數

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| 

我最終會由這兩個表喜歡的是一個後置三個周累計的頁面訪問量。更具體地講,如果我今天發出此查詢,我想沿着線的東西:

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

其中「1-3」是指最近的三個星期裏,「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周總和? –

+0

@vkp我真的很喜歡今年和去年的四個三週期間(如OP),但如果我知道如何去做今年,我認爲它不會有太大的不同去年也是如此。 – user4601931

+0

周表在這種情況下是不相關的,因爲結果取決於你運行它的日子..這個假設是正確的嗎? –

回答

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

'max(pv.week_number)over(按網頁劃分,年份)'不會考慮一年中網頁出現的所有天/星期..因此計算結果在我看來不會。 –

+0

對不起,缺乏清晰度......要回答您的具體問題:週數僅在一年內(每年1-52)。這是暗示(含糊不清,我猜)與倒數第二段的最後一句話。一個例子可能有助於第二個問題... – user4601931

+0

鑑於今天的日期,我們在第19周(通過查看周表)。我只想在第17周,第18周和第19周(這將是期望結果表中'1-3'列中的值)計算每個網站的總瀏覽量,和16(填充'4-6'欄)等等。我認爲這會給年齡帶來困難的原因在於,如果是2017年1月5日(例如),我希望2017年第1周的總數以及第51周和第52周的總數能夠填充'1 -3'欄。 – user4601931