【发布时间】:2023-04-05 14:49:01
【问题描述】:
我有一张(比如说)用户及其对各种网页的访问的大表。该表的一个示例可能是:
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 之类的东西自行加入它,但我认为当最后十二周包括新年的开始时,这个想法不会奏效。
有没有人做过类似的事情,如果有,你是如何解决这个问题的?对不同方法的建议将同样受到赞赏。
【问题讨论】:
-
每年连续 3 周的总和还是所有年份的总和?
-
@vkp 我真的很想要今年和去年的四个三周时间段(如 OP 中的),但如果我知道今年该怎么做,我不知道认为去年也会有很大不同。
-
在这种情况下,周表无关紧要,因为结果取决于您运行它的日期。这个假设是否正确?
-
@vkp 不,我想我肯定需要周表...我运行它的日期决定了我限制在周表中的哪些周。
-
如果你能展示一些有代表性的数据和预期的输出会有所帮助..还可以展示在年底应该如何处理它..如果你能设置一个 sqlfiddle 就更好了。
标签: sql postgresql amazon-redshift