如何在原始表中按天计算视图时,如何在视图上创建30天的运行总计 - Redshift

问题描述 投票:0回答:1

我希望计算每天每篇文章在过去30天内发生的所有综合浏览量。

我的数据集如下所示。发生的每个网页浏览,添加新行以及收到的日期和时间,发生视图的文章ID以及此分析不需要的一些其他信息。由于我没有每篇文章的每日综合浏览量,因此这个问题更难以解决

received_at                   article_id other_info_1 other_info_2
----------                    ---------- ------------ ------------
2017-01-04 04:03:01 +0000        987         17         desktop
2017-01-05 07:03:23 +0000        987         23          mobile
2017-01-03 01:09:10 +0000        123          1          mobile
2017-02-20 11:32:20 +0000        123         17          desktop
2017-02-01 09:03:01 +0000        123         17          tablet
2017-01-04 04:11:04 +0000        567         17          desktop

我想得到的是以下内容

article_id         date         Previous 30 day count
----------         ----         ---------------------
123              2017-02-20             90
123              2017-02-19            130
123              2017-02-18             45
456              2017-02-20             10
456              2017-02-19            100
456              2017-02-18             89
789              2017-02-20            235
789              2017-02-19            130
789              2017-02-18             89

每天我都希望获得该文章前30天发生的总观看次数

有什么想法吗?

谢谢

sql amazon-redshift running-total
1个回答
0
投票

如果我们假设每篇文章每天至少被查看一次,那么您可以进行累积总和:

select trunc(received_at) as dte, article_id,
       sum(count(*)) over (partition by article_id
                           order by trunc(received_at)
                           rows between 29 preceding and current row
                          ) as prev_30_day_count
from t
group by dte, article_id
order by dte, article_id;

如果每天至少有一个视图,这将无法正常工作。 Redshift中最好的方法可能是实际创建数据:

select a.article_id, d.dte, count(t.article_id) as day_views,
       sum(count(t.article_id)) over (partition by a.article_id
                                      order by d.dte
                                      rows between 29 preceding and current row
                                     ) as prev_30_day_count
from (select distinct trunc(received_at) as dte from t) d cross join
     (select distinct article_id from t) a left join
     t
     on d.dte = trunc(t.received_at) and a.article_id = t.article_id
group by d.dte, t.article_id;

这假设每天至少有一个关于任何文章的视图。

© www.soinside.com 2019 - 2024. All rights reserved.