在sql中滚动30天唯一身份

问题描述

| 假设您有一个表格形式:
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数量?例如。 0-30天前,1-31天前,2-32天前的唯一性,依此类推,直到30-60天前。 如果重要,数据库引擎为mysql     

解决方法

您可以尝试使用子查询:
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;
这应该为您提供每天的唯一身份用户数。但是,由于我没有可使用的数据库,因此我尚未对其进行测试。     ,我没有在MySQL中尝试过,但是希望语法是正确的。如果没有,也许它将为您指明正确的方向。首先,我经常使用数字表。它可以是仅由数字组成的物理表,也可以是生成的/虚拟的/临时的表。
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语法不熟悉,因此,如果我错了,请告诉我,我将尝试对其进行更正。     ,如果获得今天日期的天数并将其修改为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。)     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...