最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql分組排序如何取第一條數(shù)據(jù)

 更新時(shí)間:2023年07月20日 17:01:39   作者:GoodStudyAndDayDayUp  
這篇文章主要介紹了mysql分組排序如何取第一條數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mysql分組排序取第一條數(shù)據(jù)

需求:

mysql 根據(jù)某一個(gè)字段分組,然后組內(nèi)排序,最后每組取排序后的第一條數(shù)據(jù)

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

相當(dāng)于實(shí)現(xiàn)了分組和排序,只是沒(méi)有根據(jù)分組字段聚合,此時(shí)每個(gè)分組的第一條數(shù)據(jù)就是我們需要的目標(biāo)數(shù)據(jù)。

2. 再按分組字段分組,取第一條即可

實(shí)例如下:

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

必須在分組前排序,分組后排序是對(duì)分組字段和聚合字段排序。

mysql分組求組內(nèi)的最大最小值

可能有一段時(shí)間沒(méi)寫代碼,今天在項(xiàng)目里發(fā)現(xiàn)了一個(gè)bug,記錄下~

(1)數(shù)據(jù)準(zhǔn)備

《節(jié)假日表》
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 '節(jié)假日相關(guān)聯(lián)的日子',
  `rel_date_status` int(1) NOT NULL COMMENT '節(jié)假日相關(guān)聯(lián)的日是否上班(	1:放假,2:上班)',
  `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '刪除flg',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
  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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('春節(jié)', '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 ('清明節(jié)', '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 ('清明節(jié)', '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 ('清明節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('勞動(dòng)節(jié)', '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 ('端午節(jié)', '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 ('端午節(jié)', '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 ('端午節(jié)', '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 ('中秋節(jié)', '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 ('中秋節(jié)', '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 ('中秋節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '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 ('國(guó)慶節(jié)', '2019-10-01', '2019-10-12', '2', '0', '2019-09-01 23:08:17', '2019-09-02 10:49:11');

(2)需求明確

查詢條件:某年某月 yyyy-MM

查詢結(jié)果:求出在該月里 的節(jié)假日

例子:條件為2019-09,返回中秋節(jié)的2019-09-13 ~ 2019-09-15 ,國(guó)慶節(jié)的放假日2019-10-1~2019-10-7 。

并輸出對(duì)應(yīng)的節(jié)假日日期、節(jié)假日名。

(3)錯(cuò)誤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 無(wú)法取出。

(4)錯(cuò)誤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

方法一:分組 + 每組里使用聚合函數(shù)

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;

方法二:分組 + 每組里日期排序,再取第一個(gè)

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;

結(jié)果:都是

在這里插入圖片描述

(6)拓展和總結(jié)

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

我出錯(cuò)就在于,之前的sql 里 GROPY BY 只是寫了 節(jié)假日期,但又需要取出節(jié)假日名。

方法一:

注意,再mysql 里用到group_concat的時(shí)候,拼接后的字符串 是有長(zhǎng)度限制的。默認(rèn)是1024,可以通過(guò)修改mysql配置文件里的【group_concat_max_len】字段

其實(shí) 這種情況使用 group_concat + order by 的組合 ,有點(diǎn)多余的,因?yàn)橐呀?jīng)有聚合函數(shù)的出現(xiàn)。

不過(guò)想想,如果分組后 是組內(nèi) 需要按照某些字段排序的,返回 字符串類型的,可以用這個(gè)方法

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

英德市| 灵石县| 广南县| 股票| 揭东县| 五指山市| 东港市| 凤翔县| 濉溪县| 镇宁| 乡宁县| 太湖县| 讷河市| 太和县| 洞口县| 石渠县| 扎囊县| 庆城县| 天祝| 北京市| 陵川县| 铜陵市| 无极县| 乾安县| 红桥区| 老河口市| 平乐县| 宁陵县| 滕州市| 抚顺县| 金平| 礼泉县| 邵武市| 冀州市| 库车县| 仁布县| 桂平市| 阜阳市| 清镇市| 龙口市| 化州市|