mysql查询每个月最后一条数据

1、场景

业务背景:有一张公众号粉丝关注数总表,按照每天汇总关注总数,解读如下:截止到2022-01-01公众号关注总数为:45087

image.png

业务需求:需要按照月统计各个公众号关注总数。
实现分析:从存储数据来看,只需要按照公众号区分取每个月最后一条数据就是月份总数。

2、实现方式

设计思路:

① 先统计数据库中有多少个月,并取出每个月最后一天,借助Last_day()函数
②使用第一步中的结果集作为参数进行数据筛选。

  • 取出数据中的每个月份最后一天
select 
    distinct last_day(date_format(infc.ref_date,'%Y-%m-%d'))as max_date
    from  member.wechat_fans_cumulates infc 
    group by infc.app_id,date_format(infc.ref_date,'%Y-%m')

执行结果:


image.png
  • 业务实现sql 数据
select 
      fc.app_id,
      date_format(fc.ref_date,'%Y年%m月') as ref_date,
      fc.cumulate_user  
from  member.wechat_fans_cumulates fc 
inner join (select 
    distinct last_day(date_format(infc.ref_date,'%Y-%m-%d'))as max_date
    from  member.wechat_fans_cumulates infc 
    group by infc.app_id,date_format(infc.ref_date,'%Y-%m'))ib on ib.max_date = fc.`ref_date`
group by fc.app_id,date_format(fc.ref_date,'%Y年%m月');
  • 执行结果


    image.png

该实现方式,由于当前所在月还未到最后一天,存在无法获取当前月数据情况。经过考虑,使用max取每一个月中最大的一天,最终优化sql如下:

select
       fc.app_id,
       date_format(fc.ref_date, '%Y年%m月') as ref_date,
       fc.cumulate_user
from
       member.wechat_fans_cumulates fc
inner join (
       select app_id,left(ref_date,7),max(ref_date) as max_date
       from member.wechat_fans_cumulates 
       group by app_id,left(ref_date,7)
)ib on fc.app_id = ib.app_id and fc.ref_date = ib.max_date;

3、注意事项

1、这里使用inner join 而非where 子查询,涉及到效率执行问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容