SQL-获取日期范围列表中的行数

时间:2018-03-12 23:17:58

标签: mysql sql

我有一个表,其中包含有关活跃用户的一些数据。它显示用户所在的版本以及他们处于活动状态的日期。我们称这个表为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-012018-03-08之间,三行是版本2,日期介于2018-01-02之间2018-01-09

这对于for循环来说很容易,因为我可以迭代release_dates中的每一行,使用这些参数在active_users中进行查询,并在最后连接所有结果。不幸的是,我正在努力克制一个查询,我们知道这是否可行?我使用MYSQL作为我的数据库。

3 个答案:

答案 0 :(得分:1)

获得所需结果的一种方法是将聚合操作与条件选择结合起来,并仅计算与条件匹配的行:

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介于rd.release_date和rd.week_after_release_date之间,au.time,null))作为计数

如果您希望它可能稍微便于携带,您可以使用 case 而不是 if

Sample SQL Fiddle

答案 1 :(得分:0)

一种方法是相关子查询:

select rd.*,
       (select count(*)
        from active_users au
        where au.time >= rd.release_date and
              au.time < Week_After_Release_Date + interval 1 day
       ) 
from release_dates rd;

请注意,我不会在日期上使用between,以防日期包含时间组件。

答案 2 :(得分:0)

首先,您希望通过外连接第一个表和第二个表中的所有记录来了解第二个表中每个时间间隔内哪些用户处于活动状态:

0b1       // 1
0b1 << 1  // 2
0b1 << 2  // 4
0b1 << 3  // 8
0b1 << 4  // 16
0b1 << 5  // 32
0b1 << 6  // 64
0b1 << 7  // 128
0b1 << 8  // 256
0b1 << 9  // 512
0b1 << 10 // 1,024
0b1 << 11 // 2,048
0b1 << 12 // 4,096
0b1 << 13 // 8,192
0b1 << 14 // 16,384
0b1 << 15 // 32,768
0b1 << 16 // 65,536
0b1 << 17 // 131,072
0b1 << 18 // 262,144
0b1 << 19 // 524,288
0b1 << 20 // 1,048,576
0b1 << 21 // 2,097,152
0b1 << 22 // 4,194,304
0b1 << 23 // 8,388,608
0b1 << 24 // 16,777,216
0b1 << 25 // 33,554,432
0b1 << 26 // 67,108,864
0b1 << 27 // 134,217,728
0b1 << 28 // 268,435,456
0b1 << 29 // 536,870,912
0b1 << 30 // 1,073,741,824
0b1 << 31 // 2,147,483,648

您可以获得以下结果:

SELECT
  au.Version, au.Time
FROM
  active_users AS au, release_dates AS rd 
WHERE 
  au.Version = rd.Version AND au.Time >= rd.Release_Date AND au.Time < rd.Week_After_Release_Date

根据此结果,您可以按 Version | Time ---------+------------ 1 | 2018-03-01 1 | 2018-03-06 2 | 2018-01-02 2 | 2018-01-04 2 | 2018-01-05 分组并获取最终统计信息:

Version