按UnitType分组Code列并限制每组最多100条(解决STRING_AGG超限)
解决STRING_AGG字节溢出并按每组100条拆分的方案
直接上可执行的SQL方案,核心思路是先给每个UnitType下的Code分配行号,再按行号计算分组(每100条一组),最后按UnitType和分组号做聚合:
WITH RankedCodes AS ( SELECT UnitType, Code, -- 给每个UnitType下的Code排号,排序字段可根据实际需求调整 ROW_NUMBER() OVER (PARTITION BY UnitType ORDER BY Code) AS RowNum, -- 计算组号,每100条一组 CEILING(ROW_NUMBER() OVER (PARTITION BY UnitType ORDER BY Code) / 100.0) AS GroupNum FROM YourTable -- 替换成你的表名 ) SELECT UnitType, GroupNum, -- 指定STRING_AGG返回MAX长度类型,避免单组内溢出 STRING_AGG(Code, ',') WITHIN GROUP (ORDER BY Code) AS CodeList FROM RankedCodes GROUP BY UnitType, GroupNum ORDER BY UnitType, GroupNum;
关键细节说明
ROW_NUMBER():确保每个UnitType下的Code有连续序号,排序字段ORDER BY Code可换成你需要的排序逻辑(比如创建时间、ID)CEILING(...):用100.0而非100是为了触发浮点计算,避免整数除法导致分组错误(比如第100条会被分到第1组,第101条分到第2组)STRING_AGG类型处理:如果你的Code是VARCHAR类型,可手动转成MAX长度避免溢出:STRING_AGG(CAST(Code AS VARCHAR(MAX)), ',');若为NVARCHAR,结果会自动使用NVARCHAR(MAX),无需额外转换
这样处理后,每个UnitType会被拆分成N个小组,每组最多100条Code,既解决了原有的字节溢出问题,也满足了分组条数限制。
内容的提问来源于stack exchange,提问作者Locusflow
相关产品推荐
相关产品推荐

