SQL多值合并需求:同Num数据分组展示首末值及计数
解决方案
要实现该需求,可通过聚合计算结合UNION ALL生成每组的两行数据,具体实现如下:
核心思路
- 先按
Num分组,计算每组的关键聚合值:最大Start number、最小Start number、最新Date start、最早Date start以及数据条数。 - 分别生成每组的首行(包含Num、最大值、最新日期、计数)和末行(包含最小值、最早日期,其余字段为空),再合并结果并排序保证每组两行相邻。
示例SQL语句
假设数据表名为data_table,以下代码适配多数主流SQL数据库:
WITH group_agg AS ( SELECT Num, MAX(`Start number`) AS max_start_num, MIN(`Start number`) AS min_start_num, MAX(STR_TO_DATE(`Date start`, '%d.%m.%y')) AS latest_date, MIN(STR_TO_DATE(`Date start`, '%d.%m.%y')) AS earliest_date, COUNT(*) AS total_count FROM data_table GROUP BY Num ) -- 生成每组首行数据 SELECT Num, max_start_num AS `Start number`, DATE_FORMAT(latest_date, '%d.%m.%y') AS `Date start`, total_count AS Count FROM group_agg UNION ALL -- 生成每组末行数据 SELECT NULL AS Num, min_start_num AS `Start number`, DATE_FORMAT(earliest_date, '%d.%m.%y') AS `Date start`, NULL AS Count FROM group_agg -- 排序确保每组两行连续 ORDER BY Num, Count DESC;
关键说明
- 日期处理:用
STR_TO_DATE将字符串日期转为日期类型,确保MAX/MIN能正确识别日期先后,再用DATE_FORMAT转回原格式输出。不同数据库可替换对应函数:Oracle用TO_DATE/TO_CHAR,SQL Server用CONVERT。 - 字段转义:因
Start number和Date start含空格,需用反引号(MySQL)或方括号(SQL Server)包裹字段名。 - 排序逻辑:通过
ORDER BY Num, Count DESC让带计数的首行排在每组最前,空计数的末行紧随其后。
内容的提问来源于stack exchange,提问作者StimDoker
相关产品推荐
相关产品推荐

