在sql中滚动30天uniques

时间:2011-05-26 18:04:41

标签: mysql sql

假设您有一张表格:

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

3 个答案:

答案 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可以使用。