【MYSQL】分组之后获取每组最新的数据

3 篇文章 0 订阅
2 篇文章 0 订阅

记录一次有点麻烦的sql

可以直接复制拿去测试,一开始我也百度来着,发现要么没法满足我的需求,要么就连看下去的欲望都没有

建表测试demo:
CREATE TABLE `p_test` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `project_code` varchar(32) DEFAULT NULL COMMENT '项目编号',
  `collect_month` varchar(10) DEFAULT NULL COMMENT '月份',
  `evaluation_cycle` varchar(10) DEFAULT NULL COMMENT '考核周期',
  `production_completion_ratio` varchar(10) DEFAULT NULL COMMENT '发电量完成比例',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='发电量监测';
假数据
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('01', '123', '2017-06', '1', '0.89');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('02', '123', '2017-08', '1', '0.90');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('03', '123', '2018-06', '2', '0.79');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('04', '123', '2018-09', '2', '0.86');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('05', '123', '2019-06', '3', '0.88');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('06', '123', '2019-07', '3', '0.95');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('07', '123', '2020-06', '4', '0.96');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('08', '123', '2020-09', '4', '0.94');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('09', '123', '2021-06', '5', '0.93');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('10', '123', '2021-07', '5', '0.99');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('11', '124', '2017-06', '1', '0.89');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('12', '124', '2017-08', '1', '0.90');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('13', '124', '2018-06', '2', '0.79');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('14', '124', '2018-09', '2', '0.86');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('15', '124', '2019-06', '3', '0.88');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('16', '124', '2019-07', '3', '0.95');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('17', '124', '2020-06', '4', '0.96');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('18', '124', '2020-09', '4', '0.94');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('19', '124', '2021-06', '5', '0.93');
INSERT INTO `p_test`(`id`, `project_code`, `collect_month`, `evaluation_cycle`, `production_completion_ratio`) VALUES ('20', '124', '2021-07', '5', '0.99');

如上表,考核周期基本为一年一个周期,一个周期也就是最多存在12个月,此表数据也就是说一个项目,在每个月在这张表里面只存在一条数据

需求:

需要展示一个列表,项目名,考核周期(1,2,3,4,5)。。。。。项目名下展示项目即可,考核周期下展示每个周期的发电完成比例,注意坑爹的地方来了,一个考核周期存在12个月,也就是12条数据,正常一个考核年的数据不应该求平均吗,非要展示当前考核年最后一个月的数据,尝试过好多次,分组之后数据就没法确定,是不是当前考核年的最后一个月数据

有人可能会说,那按照一年12个月算,加个条件月份等于12不就好啦,但是如果12月份这个项目没数据呢,那不就查不出来了,
有人可能会说,这还不简单,直接按照月份倒叙排列之后limit 1 不就好了,我也这么想过,但是limit这个关键字是最后执行的,加了就只会取出来一条数据,但是我需求全部项目的数据

这就很坑了,尝试好久

如图:表里总共20条数据,根据上面需求,我需要查出来箭头指向的十条数据
在这里插入图片描述
sql如下:记录起来


		SELECT
            m.*
        FROM
            (
                SELECT
                    project_code,
                    evaluation_cycle,
                    collect_month,
                    production_completion_ratio
                FROM
                    p_test
                WHERE
                    1 = 1
                GROUP BY
                    project_code,
                    evaluation_cycle,
                    collect_month
            ) m,
            (
                SELECT
                    project_code,
                    evaluation_cycle,
                    max(collect_month) collect_month
                FROM
                    p_test
                WHERE
                    1 = 1
                GROUP BY
                    project_code,
                    evaluation_cycle
            ) n
        WHERE m.project_code = n.project_code
          AND m.evaluation_cycle = n.evaluation_cycle
          AND m.collect_month = n.collect_month
          

执行结果:

在这里插入图片描述

结束语

网上没找到类似的解决方案,想了几个小时,暂时只想到这种笨方法解决

有没有大佬知道什么sql函数可以直接获取分组之后,根据某个字段获取这一条数据整条信息的,而不是分组之后获取某个字段的最大最小值之类的,欢迎大佬前来指教

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值