如何在MySQL中计算一个日期内的聚合数

如何在MySQL中计算一个日期内的聚合数,mysql,Mysql,我试图在MySQL中进行累积聚合 我的原始数据如下所示:我的日期是月/日/年 鉴于此,我想得出如下结果: date source total_in_source 1/1/01 foo 2 1/2/01 foo 3 1/3/01 foo 4 其中,total_in_source是在日期的第一个值和当前值之间创建的用户数的总和 我可以使用相关子查询来实现这一点,但效率有点低: select date(user.created_at) d, u

我试图在MySQL中进行累积聚合

我的原始数据如下所示:我的日期是月/日/年

鉴于此,我想得出如下结果:

date    source    total_in_source
1/1/01  foo       2
1/2/01  foo       3
1/3/01  foo       4
其中,total_in_source是在日期的第一个值和当前值之间创建的用户数的总和

我可以使用相关子查询来实现这一点,但效率有点低:

select 
date(user.created_at) d,
user.source as user_source,
(select count(*) from users u where u.source = user_source and month(u.created_at) <= month_joined) as total_users_source,
from users user group by d, user_source
但即使这是一个自连接,也会生成n^2行来遍历users*用户。有没有关于如何做到这一点的最佳实践


提前感谢。

您需要人工创建开始和结束日期,以便在临时表或直接内联中加入

假设您想要开始、结束月份的每个组合,然后在该时间范围内,按照您描述的来源和计数进行细分。您可以这样做:

选择u.source,sdates.val start,edates.val end,count*从选择distinctdatecreated_at val从daycreated_at=1的用户选择distinctdatecreated_at val从daycreated_at=1的用户选择distinctdatecreated_at val从sdates.val,edates.val,u.source在sdates.val和edates.val之间的u.created_上加入用户

基本上,内部查询得到日期,外部查询实际执行计算。有一个日期表是很有帮助的,它为项目的每个相关日期都有一行,这样你就可以很容易地加入它,而不必做这个巫毒,但是如果没有这个,这似乎是可行的

此外,您可能不需要开始和结束的所有组合,因此您可以使用内部查询上的“where”条件或连接的“on”来满足您的需要

好奇是否有人有更好的解决方案

select 
date(user.created_at) d,
user.source as user_source,
(select count(*) from users u where u.source = user_source and month(u.created_at) <= month_joined) as total_users_source,
from users user group by d, user_source
select date(u1.created_at) as 'd',
u1.source as 'source', 
count(distinct u2.id) as count_users
from users u1, users u2
where
u2.created_at BETWEEN DATE(u1.created_at) AND DATE_ADD(DATE(u1.created_at), interval 1 day) and
group by d, source