mysql分组排序如何取第一条数据

 更新时间:2023年07月20日 17:01:39   作者:GoodStudyAndDayDayUp  
这篇文章主要介绍了mysql分组排序如何取第一条数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql分组排序取第一条数据

需求:

mysql 根据某一个字段分组,然后组内排序,最后每组取排序后的第一条数据

1. 先使用(分组字段+排序字段)排序

相当于实现了分组和排序,只是没有根据分组字段聚合,此时每个分组的第一条数据就是我们需要的目标数据。

2. 再按分组字段分组,取第一条即可

实例如下:

with 
t_picture as(
 SELECT npi_product_id,is_default_one,update_time, uri FROM datahub_product_attachment where type=1 ORDER BY npi_product_id,is_default_one DESC,update_time DESC
)
SELECT npi_product_id, (ARRAY_AGG(uri))[1] as uri FROM t_picture  group by npi_product_id

必须在分组前排序,分组后排序是对分组字段和聚合字段排序。

mysql分组求组内的最大最小值

可能有一段时间没写代码,今天在项目里发现了一个bug,记录下~

(1)数据准备

《节假日表》
CREATE TABLE `app_calendar_holiday` (
  `holiday_name` varchar(50) NOT NULL COMMENT '假期名',
  `holiday_date` varchar(10) NOT NULL COMMENT '假期的日期(yyyy-MM-dd)',
  `rel_date` varchar(10) NOT NULL COMMENT '节假日相关联的日子',
  `rel_date_status` int(1) NOT NULL COMMENT '节假日相关联的日是否上班(	1:放假,2:上班)',
  `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '删除flg',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  UNIQUE KEY `rel_date` (`rel_date`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='假期表';
-- ----------------------------
-- Records of app_calendar_holiday
-- ----------------------------
INSERT INTO `app_calendar_holiday` VALUES ('元旦', '2019-01-01', '2018-12-29', '2', '0', '2019-09-01 23:08:09', '2019-09-02 10:48:11');
INSERT INTO `app_calendar_holiday` VALUES ('元旦', '2019-01-01', '2018-12-30', '1', '0', '2019-09-01 23:08:10', '2019-09-02 10:48:16');
INSERT INTO `app_calendar_holiday` VALUES ('元旦', '2019-01-01', '2018-12-31', '1', '0', '2019-09-01 23:08:09', '2019-09-02 10:48:17');
INSERT INTO `app_calendar_holiday` VALUES ('元旦', '2019-01-01', '2019-01-01', '1', '0', '2019-09-01 23:08:10', '2019-09-02 10:48:18');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-02', '2', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:22');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-03', '2', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:23');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-04', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:24');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-05', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:25');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-06', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:25');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-07', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:26');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-08', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:26');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-09', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:27');
INSERT INTO `app_calendar_holiday` VALUES ('春节', '2019-02-05', '2019-02-10', '1', '0', '2019-09-01 23:08:11', '2019-09-02 10:48:27');
INSERT INTO `app_calendar_holiday` VALUES ('清明节', '2019-04-05', '2019-04-05', '1', '0', '2019-09-01 23:08:12', '2019-09-02 10:59:26');
INSERT INTO `app_calendar_holiday` VALUES ('清明节', '2019-04-05', '2019-04-06', '1', '0', '2019-09-01 23:08:12', '2019-09-02 10:59:28');
INSERT INTO `app_calendar_holiday` VALUES ('清明节', '2019-04-05', '2019-04-07', '1', '0', '2019-09-01 23:08:13', '2019-09-02 10:59:30');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-04-28', '2', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:31');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-05-01', '1', '0', '2019-09-01 23:08:13', '2019-09-02 10:48:45');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-05-02', '1', '0', '2019-09-01 23:08:13', '2019-09-02 10:48:46');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-05-03', '1', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:47');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-05-04', '1', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:47');
INSERT INTO `app_calendar_holiday` VALUES ('劳动节', '2019-05-01', '2019-05-05', '2', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:48');
INSERT INTO `app_calendar_holiday` VALUES ('端午节', '2019-06-07', '2019-06-07', '1', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:53');
INSERT INTO `app_calendar_holiday` VALUES ('端午节', '2019-06-07', '2019-06-08', '1', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:54');
INSERT INTO `app_calendar_holiday` VALUES ('端午节', '2019-06-07', '2019-06-09', '1', '0', '2019-09-01 23:08:14', '2019-09-02 10:48:55');
INSERT INTO `app_calendar_holiday` VALUES ('中秋节', '2019-09-13', '2019-09-13', '1', '0', '2019-09-01 23:08:16', '2019-09-02 10:48:59');
INSERT INTO `app_calendar_holiday` VALUES ('中秋节', '2019-09-13', '2019-09-14', '1', '0', '2019-09-01 23:08:16', '2019-09-02 10:49:00');
INSERT INTO `app_calendar_holiday` VALUES ('中秋节', '2019-09-13', '2019-09-15', '1', '0', '2019-09-01 23:08:16', '2019-09-02 10:49:01');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-09-29', '2', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:04');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-01', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:05');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-02', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:06');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-03', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:06');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-04', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:06');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-05', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:07');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-06', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:08');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-07', '1', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:10');
INSERT INTO `app_calendar_holiday` VALUES ('国庆节', '2019-10-01', '2019-10-12', '2', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:11');

(2)需求明确

查询条件:某年某月 yyyy-MM

查询结果:求出在该月里 的节假日

例子:条件为2019-09,返回中秋节的2019-09-13 ~ 2019-09-15 ,国庆节的放假日2019-10-1~2019-10-7 。

并输出对应的节假日日期、节假日名。

(3)错误log

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'panshi.t1.holiday_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

提示的 panshi.t1.holiday_name 无法取出。

(4)错误sql

SELECT
		t1.holiday_date AS holidayDate,
		t1.holiday_name AS holidayName,
		MIN(t1.rel_date) AS minRelDate,
		MAX(t1.rel_date) AS maxRelDate
	FROM
		app_calendar_holiday t1
	INNER JOIN (
		SELECT DISTINCT
			holiday_date
		FROM
			`app_calendar_holiday`
		WHERE
			LEFT (rel_date, 7) = '2019-09'
	) t2 ON t1.holiday_date = t2.holiday_date
	WHERE
		t1.rel_date_status = 1
	GROUP BY
		t1.holiday_date;

(5)纠正后的SQL

纠正:select 的字段要是group by 所允许的!!!追加分组的字段 t1.holiday_date

方法一:分组 + 每组里使用聚合函数

SELECT
		t1.holiday_date AS holidayDate,
		t1.holiday_name AS holidayName,
		MIN(t1.rel_date) AS minRelDate,
		MAX(t1.rel_date) AS maxRelDate
	FROM
		app_calendar_holiday t1
	INNER JOIN (
		SELECT DISTINCT
			holiday_date
		FROM
			`app_calendar_holiday`
		WHERE
			LEFT (rel_date, 7) = '2019-09'
	) t2 ON t1.holiday_date = t2.holiday_date
	WHERE
		t1.rel_date_status = 1
	GROUP BY
		t1.holiday_date,
		t1.holiday_name;

方法二:分组 + 每组里日期排序,再取第一个

SELECT
		t1.holiday_date AS holidayDate,
		t1.holiday_name AS holidayName,
		SUBSTRING_INDEX(
			GROUP_CONCAT(
				t1.rel_date
				ORDER BY
					t1.rel_date ASC
			),
			',',
			1
		) AS minRelDate,
		SUBSTRING_INDEX(
			GROUP_CONCAT(
				t1.rel_date
				ORDER BY
					t1.rel_date DESC
			),
			',',
			1
		) AS maxRelDate
	FROM
		app_calendar_holiday t1
	INNER JOIN (
		SELECT DISTINCT
			holiday_date
		FROM
			`app_calendar_holiday`
		WHERE
			LEFT (rel_date, 7) = '2019-09'
	) t2 ON t1.holiday_date = t2.holiday_date
	WHERE
		t1.rel_date_status = 1
	GROUP BY
		t1.holiday_date,
		t1.holiday_name;

结果:都是

在这里插入图片描述

(6)拓展和总结

两者方法都需要注意,如果SELECT ( 某些字段) FROM xxxx 。。。,SELECT 后的字段必须是group by 后面的,或者 使用聚合函数。

我出错就在于,之前的sql 里 GROPY BY 只是写了 节假日期,但又需要取出节假日名。

方法一:

注意,再mysql 里用到group_concat的时候,拼接后的字符串 是有长度限制的。默认是1024,可以通过修改mysql配置文件里的【group_concat_max_len】字段

其实 这种情况使用 group_concat + order by 的组合 ,有点多余的,因为已经有聚合函数的出现。

不过想想,如果分组后 是组内 需要按照某些字段排序的,返回 字符串类型的,可以用这个方法

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解mysql索引总结----mysql索引类型以及创建

    详解mysql索引总结----mysql索引类型以及创建

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。这篇文章主要介绍了详解mysql索引总结----mysql索引类型以及创建,有兴趣的可以了解一下。
    2016-11-11
  • MySQL Order By Rand()效率分析

    MySQL Order By Rand()效率分析

    本文详细解说了MySQL Order By Rand()效率优化的方案,并给出了优化的思路过程,是篇不可多得的MySQL Order By Rand()效率美文
    2012-07-07
  • 在SpringBoot中实现WebSocket会话管理的方案

    在SpringBoot中实现WebSocket会话管理的方案

    在构建实时通信应用时,WebSocket 无疑是一个强大的工具,SpringBoot提供了对WebSocket的支持,本文旨在探讨如何在 Spring Boot 应用中实现 WebSocket 会话管理,我们将通过一个模拟的场景一步步展开讨论,需要的朋友可以参考下
    2023-11-11
  • MySQL命令无法输入中文问题的解决方式

    MySQL命令无法输入中文问题的解决方式

    这篇文章主要给大家介绍了关于MySQL命令无法输入中文问题的解决方式,文中给出了详细的解决方案,对遇到这个问题的同学有很大的帮助,需要的朋友可以参考下
    2021-08-08
  • PureFTP借助MySQL实现用户身份验证的操作教程

    PureFTP借助MySQL实现用户身份验证的操作教程

    这篇文章主要介绍了PureFTP借助MySQL实现用户身份验证的操作教程,就像普通程序中的用户注册功能那样为用户登陆数据信息建立一个数据库来进行验证,需要的朋友可以参考下
    2015-12-12
  • mysql索引失效的几种情况分析

    mysql索引失效的几种情况分析

    这篇文章主要给大家介绍了关于mysql索引失效的情况,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 分组查询GROUP BY的使用与SQL执行顺序的讲解

    分组查询GROUP BY的使用与SQL执行顺序的讲解

    今天小编就为大家分享一篇关于分组查询GROUP BY的使用与SQL执行顺序的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • MySQL数据库CPU飙升到100%的详细解决方案

    MySQL数据库CPU飙升到100%的详细解决方案

    在监控线上数据库的运行是否安全、正常的过程中,cpu使用率是一个重要的指标,一旦cpu使用率飙升至90%+甚至达到100%,必然会对数据库的正常工作产生影响,下面这篇文章主要给大家介绍了关于MySQL数据库CPU飙升到100%的详细解决方案,需要的朋友可以参考下
    2023-05-05
  • MySQL 到 ClickHouse 实时数据同步实操

    MySQL 到 ClickHouse 实时数据同步实操

    这篇文章主要分享的是MySQL 到 ClickHouse 实时数据同步实操,小编测试了测了一种方式,可以非常方便地完成 MySQL 数据实时同步到ClickHouse,跟大家分享一下,希望对你有帮助
    2022-01-01
  • JDBC连接MySQL5.7的方法

    JDBC连接MySQL5.7的方法

    这篇文章主要介绍了JDBC连接MySQL5.7的方法,需要的朋友可以参考下
    2018-05-05

最新评论