假设您有一张表格:
create table user_activity (
user_id int not null,
activity_date timestamp not null,
...);
在过去30天内选择唯一user_id的数量非常简单。
select count(distinct user_id) from user_activity where activity_date > now() - interval 30 day;
但是,您如何选择过去30天中每个过去30天内唯一user_id的数量?例如。 uniques 0-30天前,1-31天前,2-32天前等30-60天前。
如果重要,数据库引擎是mysql
答案 0 :(得分:1)
我没有在MySQL中尝试这个,但希望语法是正确的。如果没有,也许它会指向正确的方向。首先,我经常使用Numbers表。它可以是简单地由数字组成的物理表,也可以是生成/虚拟/临时表。
SELECT
N.number,
COUNT(DISTINCT UA.user_id)
FROM
Numbers N
INNER JOIN User_Activity UA ON
UA.activity_date > NOW() - INTERVAL 30 + N.number DAY AND
UA.activity_date <= NOW() - INTERVAL N.number DAY
WHERE
N.number BETWEEN 0 AND 30
GROUP BY
N.number
我不熟悉整个INTERVAL语法,所以如果我弄错了,请告诉我,我会尝试纠正它。
答案 1 :(得分:0)
如果您获得今天日期的天数并将其修改为30,您将获得当天的偏移量。然后将其添加到每个数字的日期并将结果除以30,这将为您提供一组天数。然后按此编号对结果进行分组。所以在代码中这样:
select count(distinct user_id), (to_days(activity_date)+(to_days(now()) % 30)) / 30 as period
from user_activity
group by (to_days(activity_date)+(to_days(now()) % 30)) / 30
我将离开计算一段时间的反向编号(提示:将当前日期的句号作为“max”并减去上面的句号并加1。)
答案 2 :(得分:0)
您可以尝试使用子查询:
SELECT DISTINCT `activity_date` as `day`, (
SELECT count(DISTINCT `user_id`) FROM `user_activity` WHERE `activity_date` = `day`
) as `num_uniques`
FROM `user_activity`
WHERE `activity_date` > NOW() - INTERVAL 30 day;
这应该为您提供每天的唯一身份用户数。但是,我没有测试过这个,因为我没有DB可以使用。