如何解决在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。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。