SQL查询显示每月每月的结果

时间:2015-04-24 10:43:27

标签: mysql sql

我有一个数据库,其中包含我的用户已完成时间戳的每个操作,如下所示:
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

我怎样才能有一个单独的查询,每周给我这个?

(对不起,这太长了,我意识到我想要更清楚)

谢谢!

2 个答案:

答案 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