如何在SQL表中将同组连续序列号转换为From-To范围列
解决方案
假设你的表名为your_table,serial列是字符串格式的数字(如'001'),可以用以下SQL查询实现需求:
WITH grouped_serials AS ( SELECT extra, serial, -- 将serial转为数值,减去组内行号,连续序列会得到相同的分组键 CAST(serial AS INT) - ROW_NUMBER() OVER (PARTITION BY extra ORDER BY serial) AS group_key FROM your_table ) SELECT extra, MIN(serial) AS "From", MAX(serial) AS "To" FROM grouped_serials GROUP BY extra, group_key ORDER BY extra, "From";
说明
- 先用CTE
grouped_serials生成分组键:对每个extra组内的serial排序后,用serial的数值减去行号,连续的serial会得到相同的group_key(比如001-1=0,002-2=0,…,010-10=0;011-1=10,012-2=10) - 随后按
extra和group_key分组,取每组最小的serial作为起始,最大的作为结束 - 如果
serial是固定长度的格式(比如3位),可以用LPAD函数保持输出格式,例如LPAD(MIN(serial), 3, '0'),根据实际长度调整参数即可
内容的提问来源于stack exchange,提问作者Data Enthusiast
相关产品推荐
相关产品推荐

