【问题标题】:How to get average activity per person per day if a zero-day generates no rows/data?如果零日不生成行/数据,如何获得每人每天的平均活动?
【发布时间】:2019-09-13 05:57:16
【问题描述】:

我正在对网站订阅者的活动进行一些研究。具体来说,我想查看 2018 年每个订阅者每天的平均点击次数。不幸的是,提供给我的数据表没有考虑订阅者根本不参与网站的天数,但我需要零-天数。

如果我以如下内容开始查询:

SELECT SubscriberID, date_trunc('Day', Date_of_Activity), count(*) as Clicks 
FROM WSD.Clicks 
WHERE Date_Of_Activity between date('2018-01-01') and date('2019-01-01') 
GROUP BY 1,2

...如果每个订阅者在该日期发生了确认的点击,他们将只有一个特定日历日的条目;否则,源数据中不会生成任何行。这会导致平均通胀,因为它只考虑活跃的潜艇;一个人一年中有一天使用该网站并点击 2 次现在相当于一个人一年中使用该网站 300 天每天点击两次。如何让查询为每个订阅者声明一个日历日,并在他们实际上没有记录活动的情况下赋予“0”值?

仅供参考,此表只有几列:

SubscriberID(字符串)、Date_of_Activity(时间戳)、Type_of_Activity (字符串)

我正在 Athena (AWS) 中查询数据。

【问题讨论】:

  • 我建议创建一个表(可能一个临时表是有意义的)。用您想要的范围内的日期填充它。然后将其与生成所有用户的子查询相结合。获取该结果并将其连接到数据并计算行数。
  • 创建日历表,然后添加加入并计算每日订阅
  • 请注意,BETWEEN 条件包括两条边,因此您的查询还包括 2019 年 1 月 1 日发生的点击

标签: sql amazon-athena presto


【解决方案1】:

您可以根据日期列表加入。这可以在 Postgres 中使用 generate_series() 轻松完成:

select c.subscriberid, 
       d.day::date as date_of_activity, 
       count(c.date_of_activity) as clicks 
from generate_series(date '2018-01-01', date '2018-12-31', interval '1' day) as d(day)
  left join clicks c on c.date_of_activity::date = d.day::date 
group by 1,2
order by 1,2;

count() 忽略null 值,当没有匹配时,左连接将在clicks 的列中返回null。所以count(c.Date_Of_Activity) 在那些日子里将返回零。

不过,这也会显示 subscriberid 的空值。如果您想为每个subscriberid/date_of_activity 组合创建假行,则需要交叉加入所有订阅者的列表。请注意,这将在结果中为您提供(number of subscribers) * 365 行!如果您有数百万订阅者,这可能不是您想要的:

select s.subscriberid, 
       d.day::date as date_of_activity, 
       count(c.date_of_activity) as clicks 
from generate_series(date '2018-01-01', date '2018-12-31', interval '1' day) as d(day)
  cross join subscribers s
  left join clicks c on c.date_of_activity::date = d.day::date 
group by 1,2
order by 1,2;

在线示例:https://rextester.com/QIGI84548

【讨论】:

  • 谢谢! Athena 不支持 Generate_series,但我能够使用表的日期变量作为子查询中的唯一选择项来生成日期的总列表。这种结构很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多