SQL如何为type值处于0到9区间的行分配相同group_id
分组需求SQL实现方案
核心逻辑是通过累加标记实现动态分组:每遇到1条type不在0-9区间的行(即页眉/页脚行),分组计数+1,后续所有type在0-9区间的明细行沿用当前分组计数作为group_id,直到遇到下一个非0-9的type行。
实现代码
你可以直接在生成#myData临时表后执行以下语句完成group字段更新:
WITH group_calc AS ( SELECT id, type, -- 累加非明细行标记生成group_id SUM(CASE WHEN type NOT BETWEEN '0' AND '9' THEN 1 ELSE 0 END) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS calculated_group FROM #myData ) UPDATE t SET t.[group] = gc.calculated_group FROM #myData t INNER JOIN group_calc gc ON t.id = gc.id -- 如果你只需要给type在0-9的明细行赋值group,保留页眉页脚的group为空,可取消注释下面的条件 -- WHERE t.type BETWEEN '0' AND '9'
验证与注意事项
- 执行完更新后可以用以下语句核对结果是否符合预期:
SELECT id, type, [group] FROM #myData ORDER BY id
- 方案依赖
id列的顺序和你原始文件的导入顺序完全一致,如果有明确可用于排序的字段,建议把生成id时的ORDER BY (SELECT NULL)替换为真实排序字段,避免顺序错乱导致分组错误。
内容的提问来源于stack exchange,提问作者Gilberto Marinho
相关产品推荐
相关产品推荐

