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

标签 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-022018-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

Sample SQL Fiddle

关于mysql - SQL-获取日期范围列表中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245885/

相关文章:

php - 关于 html 页面中的 stripslash 如何在 php 页面中隐藏...

php - SQLSTATE[42S02] : Base table or view not found: 1146 Table 'laravel_abonamenty2.currencies' doesn't exist

mysql - 从外部 vagrant 连接到 MySQL

sql - .MDF 数据库的 UnixODBC 驱动程序问题。或 : is there a way to easily extract a bunch of tables without an sql server?

sql - 在 Oracle11g 中使用函数作为列的默认值

sql - 如何在oracle/sql中将数字转换为时间戳

MySQL - 条件 MIN MAX 返回不同的记录

php - MySQL 查询 PHP "sorry...query failed, please click me"错误

php - 显示存储在 MySQL 数据库 PHP 中的 PDF 文件

PHP不会创建mysql表,但是可以手动输入。