我有一个表,其中包含有关活跃用户的一些数据。它显示用户使用的版本以及他们活跃的日期。我们称此表为 active_users
:
Version Time
-------------------------
1 '2018-03-12'
1 '2018-03-01'
1 '2018-03-06'
1 '2018-03-09'
2 '2018-01-02'
2 '2018-01-04'
2 '2018-01-05'
2 '2018-01-11'
我还有一个表,返回版本发布日期和发布日期后一周。我们称此表为 release_dates
:
Version Release_Date Week_After_Release_Date
------------------------------------------------
1 '2018-03-01' '2018-03-08'
2 '2018-01-02' '2018-01-09'
现在我想在一个查询中做的是计算在第二个表的行中列出的日期之间活跃的用户数。
结果是这样的:
Version Count
------------------------------------------------
1 2
2 3
因为 active_users
中有两行是版本 1 并且日期在 2018-03-01
和 2018-03-08
之间三行是版本 2,日期介于 2018-01-02
和 2018-01-09
之间。
使用 for 循环很容易做到这一点,因为我可以遍历 release_dates
中的每一行,使用这些参数在 active_users
中进行查询并将所有参数连接起来结果在最后。不幸的是,我正在限制执行单个查询,我们知道这是否可能吗?我使用 MYSQL 作为我的数据库。
最佳答案
获得所需结果的一种方法是将聚合操作与条件选择结合起来,只计算符合条件的行:
select
au.version,
sum(if(au.time between rd.release_date and rd.week_after_release_date,1,0)) as count
from active_users au
join release_dates rd on au.version = rd.version
group by au.version
如果你更喜欢使用计数函数,第三行可以写成:
count(if(au.time between rd.release_date and rd.week_after_release_date, au.time, null)) 作为计数
如果你想让它更便携,你可以使用 case 而不是 if
关于mysql - SQL-获取日期范围列表中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245885/