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日?