如何将订单连续行号合并为带连字符的压缩字符串?
如何将连续订单行号合并为分段压缩字符串?
要实现把同商品的连续订单行号合并成起始-结束格式、非连续行号用逗号分隔的压缩字符串,可以通过窗口函数分组连续行段 + 字符串聚合的方式实现,具体步骤如下:
实现思路
核心是先把连续的行号归为同一分组:对每个商品的行号按顺序排序后,计算Line - 行号的排序序号,连续行号的这个差值是固定值,以此作为分组标识;之后每个分组取最小和最大行号,生成对应的分段字符串,最后聚合所有分段即可。
完整SQL代码
WITH LineGroups AS ( SELECT Item, Line, -- 生成连续行段的分组标识:连续行号的该值相同 Line - ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Line) AS GroupId FROM YourTable ), SegmentedLines AS ( SELECT Item, -- 生成单个分段:起始和结束相同则只显示数字,否则显示"起始-结束" CASE WHEN MIN(Line) = MAX(Line) THEN CAST(MIN(Line) AS VARCHAR(10)) ELSE CONCAT(MIN(Line), '-', MAX(Line)) END AS LineSegment FROM LineGroups GROUP BY Item, GroupId ) SELECT CONCAT('Lines: ', STRING_AGG(LineSegment, ', ') WITHIN GROUP (ORDER BY MIN(Line))) AS [Line], Item FROM SegmentedLines GROUP BY Item;
代码解释
- LineGroups CTE:给每个商品的行号排序,通过
Line - ROW_NUMBER()计算分组ID,连续的行号会被分到同一组(比如Apple的1、2、3行,计算后GroupId都是0;第5行GroupId是1,因为5-4=1;7、8行GroupId是2,7-5=2)。 - SegmentedLines CTE:按商品和分组ID聚合,得到每个连续段的起始和结束行号,生成对应的分段字符串。
- 最终查询:用
STRING_AGG把每个商品的所有分段按行号顺序拼接,加上前缀Lines:。
测试结果
用你提供的源数据执行后,会得到期望的结果:
| Line | Item |
|---|---|
| Lines: 1-3, 5, 7-8 | Apple |
| Lines: 4, 6, 9-10 | Orange |
内容的提问来源于stack exchange,提问作者Jack Morris
相关产品推荐
相关产品推荐

