我有一个数据库,其中包含我的用户已完成时间戳的每个操作,如下所示:
user_id
; action
; creation_date
我想评估一段时间内活跃用户的数量。 我可以看到每周活跃的用户数量(count(distinct user_id)),但我想知道自年初到每周活跃的用户数量,如下所示:
- 活跃的用户数量1
- 活跃的第1周或第2周的用户数量
- 活跃的第1周,第2周或第3周的用户数量
等
我不能每周都添加活跃用户,因为他们回来了,所以如果我做了一些会被计算为双倍。
现在我可以使用此查询每周执行此操作:
SELECT count(distinct uca.user_id)
FROM DATABASE
WHERE (extract(week from uca.creation_date)) <= 9
我怎样才能有一个单独的查询,每周给我这个?
(对不起,这太长了,我意识到我想要更清楚)
谢谢!
答案 0 :(得分:3)
您可以使用子查询。您的示例查询有点令人困惑(表别名uca
未定义,您只提取周而不是年份)。我想你想要这样的东西:
SELECT year(uca.creation_date), week(uca.creation_date),
count(distinct uca.user_id) as WEEK_users,
(select count(distinct uca2.user_id)
from database uca2
where year(uca2.creation_date) = year(uca.creation_date) and
week(uca2.creation_date) <= week(uca.creation_date)
) as YTD_users
FROM DATABASE uca
GROUP BY year(uca.creation_date), week(uca.creation_date)
答案 1 :(得分:0)
我担心Gordon Linoff的答案中的相关子查询可能会针对输入的每一行执行,这是低效的。这是一种方法,相当于只为输出的每一行执行一次:
SELECT
year(creation_date),
week(creation_date),
count(distinct user_id) as YTD_users
FROM uca
JOIN (SELECT year(creation_date) as year, week(creation_date) as week
FROM uca
GROUP BY year(creation_date), week(creation_date)
) AS weeks
ON year(creation_date) = year AND week(creation_date) <= week