如何用SQL合并MariaDB 10.5 InnoDB表中连续ID的行?
如何将MariaDB 10.5中连续的ext_id分组为范围展示
针对你的需求,利用MariaDB 10.5支持的窗口函数,可轻松识别连续ID的分组,输出你需要的两种格式:
格式一:分开展示起止ID
该格式适合后续数据分析或进一步处理,SQL语句如下:
SELECT MIN(ext_id) AS id_start, MAX(ext_id) AS id_end FROM ( -- 生成分组标识:连续ID的ext_id减去行号会得到相同值 SELECT ext_id, ext_id - ROW_NUMBER() OVER (ORDER BY ext_id) AS group_id FROM your_table_name -- 替换为你的实际表名 ) grouped GROUP BY group_id ORDER BY id_start;
逻辑说明:
子查询中,ROW_NUMBER()按ext_id排序生成连续行号,连续的ext_id与行号的差值固定,以此作为分组依据;外层查询按分组聚合,取每组的最小/最大值即为连续ID的起止。
格式二:合并为范围字符串
如果需要直接输出1-2这种紧凑格式,可通过CASE和CONCAT处理聚合结果:
SELECT CASE WHEN MIN(ext_id) = MAX(ext_id) THEN CAST(MIN(ext_id) AS CHAR) ELSE CONCAT(MIN(ext_id), '-', MAX(ext_id)) END AS id FROM ( SELECT ext_id, ext_id - ROW_NUMBER() OVER (ORDER BY ext_id) AS group_id FROM your_table_name -- 替换为你的实际表名 ) grouped GROUP BY group_id ORDER BY MIN(ext_id);
额外说明:
如果表中存在重复的ext_id,可在子查询中添加DISTINCT去重,避免干扰分组逻辑:
SELECT DISTINCT ext_id, ext_id - ROW_NUMBER() OVER (ORDER BY ext_id) AS group_id FROM your_table_name
内容的提问来源于stack exchange,提问作者Zulakis
相关产品推荐
相关产品推荐

