【问题标题】:Getting total over trailing three week periods在过去的三周内获得总计
【发布时间】: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


【解决方案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;

【讨论】:

  • max(pv.week_number) over (partition by webpage, year) 不会考虑网页在一年中存在的所有天数/周数。所以我认为计算会被取消。
  • 对不起,不清楚...回答您的具体问题:周数仅在一年内(每年 1-52)。倒数第二段的最后一句话暗示了这一点(我猜是模糊的)。一个例子可能有助于解决第二个问题......
  • 鉴于今天的日期,我们在第 19 周(通过查看周表)。我只想计算第 17 周、第 18 周和第 19 周中每个网站的总浏览量(这将是所需结果表中“1-3”列中的值),第 14 周、第 15 周,和 16(填充“4-6”列),依此类推。我认为在更改年份时这会带来困难的原因是,如果是 2017 年 1 月 5 日(例如),我希望 2017 年第 1 周的总数以及第 51 周和第 52 周的总数填充 '1 -3' 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多