Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-每月服务的客户端数_Mysql_Sql_Group By - Fatal编程技术网

MySQL-每月服务的客户端数

MySQL-每月服务的客户端数,mysql,sql,group-by,Mysql,Sql,Group By,我有一份客户名单,上面有开始日期和结束日期。我想吸引一些每月都有服务的客户 id Start Date End Date 1 2019-01-01 2020-01-01 2 2019-02-01 2019-03-01 因此,如果我想拉一个查询,说: 2019年1月,共有1名客户 但是二月有两个 三月也一样 然而,在四月份,它会让我得到1 感谢您抽出时间,考虑使用union all和window函数这需要MySQL 8.0: select dt, s

我有一份客户名单,上面有开始日期和结束日期。我想吸引一些每月都有服务的客户

id    Start Date     End Date
1     2019-01-01     2020-01-01
2     2019-02-01     2019-03-01
因此,如果我想拉一个查询,说:

2019年1月,共有1名客户

但是二月有两个

三月也一样

然而,在四月份,它会让我得到1

感谢您抽出时间,

考虑使用union all和window函数这需要MySQL 8.0:

select dt, sum(sum(cnt)) over(order by dt) cnt
from (
    select start_date dt, 1 cnt from mytable
    union all select end_date, -1 from mytable
) t
group by dt
order by dt
如果要将结束日期为当月第一个月的当月的活动客户计算在内,请执行以下操作:

select dt, sum(sum(cnt)) over(order by dt) cnt
from (
    select start_date dt, 1 cnt from mytable
    union all select end_date + interval 1 month, -1 from mytable
) t
group by dt
order by dt
注意,这假设开始和结束日期总是在月的第一天,如示例数据中所示,否则需要在联合子查询中进行一些调整

如果您希望在该期间每月有一条记录,可以使用递归cte生成日期列表:

with d as (
    select min(start_date) dt, max(end_date) max_dt from mytable
    union all
    select dt + interval 1 month, max_dt from d where dt < max_dt
)
select d.dt, sum(sum(t.cnt)) over(order by d.dt) cnt
from d
left join (
    select start_date dt, 1 cnt from mytable
    union all select end_date, -1 from mytable
) t on t.dt = d.dt
group by d.dt
order by d.dt

请阅读并编辑您的问题,3月份不应该只有一个客户,因为客户的结束日期是3月1日?