总计超过三周的时间

时间:2017-05-05 21:17:22

标签: sql postgresql amazon-redshift

我有一个(例如)用户的大表和他们对各种网页的访问。该表的一个例子可能是:

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这样的东西加入它,但我不认为这个想法在过去十二周包括新年的开始时会起作用。

有没有人做过类似的事情,如果有的话,你是怎么解决这个问题的?对于不同方法的建议同样值得赞赏。

0 个答案:

没有答案