mysql分組排序如何取第一條數(shù)據(jù)
mysql分組排序取第一條數(shù)據(jù)
需求:
mysql 根據(jù)某一個字段分組,然后組內(nèi)排序,最后每組取排序后的第一條數(shù)據(jù)
1. 先使用(分組字段+排序字段)排序
相當(dāng)于實現(xiàn)了分組和排序,只是沒有根據(jù)分組字段聚合,此時每個分組的第一條數(shù)據(jù)就是我們需要的目標數(shù)據(jù)。
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分組求組內(nèi)的最大最小值
可能有一段時間沒寫代碼,今天在項目里發(fā)現(xiàn)了一個bug,記錄下~
(1)數(shù)據(jù)準備
《節(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)建時間', `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 ('春節(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 ('勞動節(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 ('勞動節(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 ('勞動節(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 ('勞動節(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 ('勞動節(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 ('勞動節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ('國慶節(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 ,國慶節(jié)的放假日2019-10-1~2019-10-7 。
并輸出對應(yīng)的節(jié)假日日期、節(jié)假日名。
(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
方法一:分組 + 每組里使用聚合函數(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;
方法二:分組 + 每組里日期排序,再取第一個
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ù)。
我出錯就在于,之前的sql 里 GROPY BY 只是寫了 節(jié)假日期,但又需要取出節(jié)假日名。
方法一:
注意,再mysql 里用到group_concat的時候,拼接后的字符串 是有長度限制的。默認是1024,可以通過修改mysql配置文件里的【group_concat_max_len】字段
其實 這種情況使用 group_concat + order by 的組合 ,有點多余的,因為已經(jīng)有聚合函數(shù)的出現(xiàn)。
不過想想,如果分組后 是組內(nèi) 需要按照某些字段排序的,返回 字符串類型的,可以用這個方法
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
當(dāng)Mysql行鎖遇到復(fù)合主鍵與多列索引詳解
這篇文章主要給大家介紹了關(guān)于當(dāng)Mysql行鎖遇到復(fù)合主鍵與多列索引的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09MySql子查詢IN的執(zhí)行和優(yōu)化的實現(xiàn)
本文主要介紹了MySql子查詢IN的執(zhí)行和優(yōu)化的實現(xiàn),詳細的介紹了為什么IN這么慢以及如何優(yōu)化,具有一定的參考價值,感興趣的可以了解一下2021-07-07MySQL中Like模糊查詢速度太慢該如何進行優(yōu)化
在業(yè)務(wù)場景中經(jīng)常會用到like模糊查詢,但是大家都知道,like是用不到索引的,所以當(dāng)數(shù)據(jù)量非常大時,速度會非常慢,這篇文章主要給大家介紹了關(guān)于MySQL中Like模糊查詢速度太慢該如何進行優(yōu)化的相關(guān)資料,需要的朋友可以參考下2021-12-12淺析MySQL數(shù)據(jù)的導(dǎo)出與導(dǎo)入知識點
在本文里我們給大家分享了關(guān)于MySQL數(shù)據(jù)的導(dǎo)出與導(dǎo)入的相關(guān)實例和知識點內(nèi)容,需要的朋友們跟著學(xué)習(xí)下。2019-03-03replace MYSQL字符替換函數(shù)sql語句分享(正則判斷)
最近更新網(wǎng)站發(fā)現(xiàn)一些字段的值不是預(yù)期的效果,需要替換下值,通過下面的sql語句,直接執(zhí)行就可以了2012-06-06Mysql慢查詢?nèi)罩疚募D(zhuǎn)Excel的方法
面對公司生產(chǎn)環(huán)境中慢SQL問題的排查工作,由于日志文件格式混亂,相關(guān)資料無法提供便捷的格式化處理工具,故而自主編寫一套Java讀取慢SQL日志轉(zhuǎn)為Excel的小工具,該工具可以有效提升排查工作的效率,方便快捷地解決問題2024-10-10