You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将订单连续行号合并为带连字符的压缩字符串?

如何将连续订单行号合并为分段压缩字符串?

要实现把同商品的连续订单行号合并成起始-结束格式、非连续行号用逗号分隔的压缩字符串,可以通过窗口函数分组连续行段 + 字符串聚合的方式实现,具体步骤如下:

实现思路

核心是先把连续的行号归为同一分组:对每个商品的行号按顺序排序后,计算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;

代码解释

  1. 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)。
  2. SegmentedLines CTE:按商品和分组ID聚合,得到每个连续段的起始和结束行号,生成对应的分段字符串。
  3. 最终查询:用STRING_AGG把每个商品的所有分段按行号顺序拼接,加上前缀Lines: 。

测试结果

用你提供的源数据执行后,会得到期望的结果:

LineItem
Lines: 1-3, 5, 7-8Apple
Lines: 4, 6, 9-10Orange

内容的提问来源于stack exchange,提问作者Jack Morris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:48:22